Crate basic_text
source ·Expand description
Basic Text strings and I/O streams
This crate provides several utilities for working with Basic Text.
-
TextStringandTextStrare similar to the standard library’sStringandstr, but use the Basic Text string format, along with atext!("...")macro for Basic Text string literals. -
TextReaderandTextWriterare input and output streams which use the Basic Text stream format. On input, content is converted in a way which is lossy with respect to the original bytestream. Output uses the “strict” conversion method, in which invalid content is diagnosed with errors. -
BufReadText, an extension trait that addstext_linesandtext_lines_lossytoBufReadimplementations for reading lines from an input stream asBasicTextstrings. -
TextDuplexeris aDuplexfor reading and writing on an interactive stream using Basic Text.
Examples
Working with TextString and company is overall similar to working with
String and company, but with a little more syntax in some places:
use basic_text::{text, text_substr, ReadText, TextReader, TextString, TextWriter, WriteText};
use std::io::{stdin, stdout, Write};
// Wrap stdout in an output stream that ensures that the output is
// Basic Text.
let mut stream = TextWriter::new(stdout());
// Construct Basic Text literals.
let greeting = text!("Hello, World!");
// Write Basic Text directly.
stream.write_text(greeting).unwrap();
// `TextString` can't be split at arbitrary boundaries, so this crate has
// substring types, so you can work with Basic Text content incrementally.
// The following code prints the "Service Dog" ZWJ Sequence "🐕🦺" in
// parts, where splitting it would not be valid in Basic Text.
stream
.write_text_substr(text_substr!("🐕\u{200d}"))
.unwrap();
stream.write_text_substr(text_substr!("🦺")).unwrap();
// Regular strings with Basic Text content can be written.
writeln!(stream, "Valid!").unwrap();
// But invalid content is diagnosed as an error.
writeln!(stream, "\u{c}Invalid!\u{7}").unwrap_err();
// A Basic Text reader, on the other hand, always succeeds, by replacing
// invalid sequences with `�`s.
let mut s = TextString::new();
TextReader::new(stdin())
.read_to_text_string(&mut s)
.unwrap();Macros
TextStr literal support: text!("string literal").TextSubstr literal support: text_substr!("string literal\u{200e}").Structs
FromTextError is to TextString as FromUtf8Error is to String.HalfDuplex implementation which translates from an input HalfDuplex
implementation producing an arbitrary byte sequence into a valid Basic Text
stream.TextError is to TextString as Utf8Error is to String.BufReadText.BufReadText.Read implementation which translates from an input Read
implementation producing an arbitrary byte sequence into a valid Basic Text
stream.WriteLayered implementation which translates to an output
WriteLayered producing a valid Basic Text stream from an arbitrary
byte sequence.Constants
TextReader’s read.Traits
BufRead which adds functions for reading
lines as TextStrings.ReadLayered trait with read_text_with_status, a method for
reading text data.TextStr.Functions
std::io::copy, but for streams that can operate directly on text
strings, so we can avoid re-validating them as text.std::io::copy, but for streams that can operate directly on text
strings, so we can avoid re-validating them as text.ReadText::read_exact_text_substr.ReadText::read_to_text_string.WriteText::write_text_substr.