Nocter v0.28.0 Release Notes
Nocter v0.28.0 completes the text-production boundary needed by ordinary command-line applications. It adds borrowed ASCII trimming, bounded owned transformations, one recoverable formatting contract, line-oriented writers, and symmetric stdout and stderr conveniences. The only implemented host and native target remains arm64-darwin.
Borrowed and Owned Text Operations
Borrowed str values now expose allocation-free ASCII edge trimming:
let input: &str = " alpha beta\r\n"
let trimmed = input.trim_ascii()
trim_ascii_start, trim_ascii_end, and trim_ascii return views into the input. They recognize ASCII space plus tab, LF, vertical tab, form feed, and CR. They do not remove non-ASCII whitespace or allocate an owned value.
Two materializing transformations produce independently owned String values:
let rule = "=".repeat(10)
let slug = trimmed.replace_all(" ", "-")?
repeat checks the complete required capacity before construction. replace_all scans from left to right without overlapping matches or recursively searching replacement text. An empty pattern returns std.str.empty_pattern.
One Formatting Contract
std/fmt.Format now requires one recoverable operation and derives interpolation's aborting policy as its standard default:
pub interface Format {
pub method &self.try_format_into(output: &+String): void!
pub default method &self.format_into(output: &+String): void
}
Project types implement try_format_into once. Built-in integers, bool, str, and String use the same contract. Interpolation and type-owned integer conversion share one private scalar renderer, while recoverable callers can provide their own destination allocator.
The former public fmt.try_append_* and fmt.append_* function matrices are removed rather than retained as compatibility aliases. Existing custom Format implementations must replace their format_into body with try_format_into and propagate destination growth failure.
Symmetric Text Output
Every Writer derives a line adapter from its exact text operation:
output.write_line("complete record")?
write_line writes the supplied UTF-8 text and exactly one LF. It does not allocate a combined buffer, select a platform newline, or promise atomicity across the two writes.
The process stream surface is now symmetric:
io.print("partial")?
io.println(" line")?
io.eprint("warning: ")?
io.eprintln("details")?
stdout, stderr, print, println, eprint, and eprintln publish noalloc. They share the same complete descriptor-write policy as File.write, including interruption retry, partial-write progress, zero-progress rejection, and stable I/O failures. Output accepts text; formatting remains explicit through interpolation.
Practical Integration
The new text-banner package example composes command-line arguments, borrowed trimming, owned replacement and repetition, interpolation, integer formatting, stdout reporting, and stderr usage failure. Formatter and semantic editor tests consume its ordinary package source. Hover, completion, and navigation resolve through the same public standard-library declarations used by native compilation.
Compatibility and Non-goals
v0.28.0 changes the public Format implementation requirement and removes the old closed append function matrix. The text and output additions otherwise extend existing type-owned and module-qualified APIs without adding language syntax, compiler primitives, MIR operations, ABI rules, or runtime dependencies.
This release does not add Unicode property tables, locale-sensitive case conversion, formatting specifiers, terminal styling, standard input, subprocess execution, networking, async I/O, another target, or persistent compiler caches.
Candidate Qualification
Release-content commit c246a9d1e9fe4a6792b7282a553d02d195fe2e0e passed two independent locked workspace runs with 1,521 tests passed, zero failed, and one ignored in each run. The ignored public-HTTPS acquisition test passed separately. Warnings-denied all-target Clippy, no-default-features checking, deterministic documentation, formatter checks, and repository validation also passed.
Two independent optimized builds produced the same archive and installed home. The retained local archive is 8,270,498 bytes and has SHA-256 c743ae29a9f3a83202dd8b6733d281c29e711e996e08abd3e9fb591f2efa1b63. Its isolated installed home passed version and integrity checks, every public example, package run/build/test/graph operations, the exact text-banner output contract, framed LSP requests, immutability checking, and compiler and standard-library tamper rejection. Publication reuses that retained candidate without rebuilding it.