Short (up to 65,535 bytes) immutable strings to e.g. parse tokens, implemented in Rust. These are sometimes called "German Strings", because Germans have written the paper mentioning them
1// SPDX-FileCopyrightText: Copyright (C) 2024 Roland Csaszar
2// SPDX-License-Identifier: EUPL-1.2
3//
4// Project: token-string
5// File: main.rs
6// Date: 16.Nov.2024
7// =============================================================================
8//! This is just an example on how to use [`token_string`].
9
10#![expect(
11 clippy::print_stdout,
12 reason = "We are in a CLI program, we need to print something"
13)]
14#![expect(clippy::use_debug, reason = "We are trying to show debug printing")]
15
16use token_string::{Builder, Collect as _, Concat as _, TokenString};
17
18/// Main entry point of the program.
19fn main() {
20 let str = "HUGO HUGO HUGO HUGO".to_owned();
21 let s1 = TokenString::try_from(str).unwrap();
22 println!("S1: {s1}");
23 println!("S1 debug: {s1:?}");
24
25 let s1_str: &str = s1.as_str();
26 let s1_bytes: &[u8] = s1.as_bytes();
27 let s1_string = s1.as_string();
28 let s1_chars: Vec<char> = s1.as_chars();
29
30 assert!(&s1 == s1_str, "Should be the same!");
31 assert!(&s1 == s1_bytes, "Should be the same!");
32 assert!(s1 == s1_string, "Should be the same!");
33 assert!(s1.as_chars() == s1_chars, "Should be the same!");
34
35 println!("========================================");
36
37 let s2 = TokenString::try_from("HUGO06").unwrap();
38 for i in &s2 {
39 println!("S2 iterator: {i}");
40 }
41
42 println!("========================================");
43
44 let s3: TokenString = "HUGO HUGO HUGO".try_into().unwrap();
45 let s4 = TokenString::default();
46 println!("S3 debug: {s3:?}\nS4 debug: {s4:?}");
47 println!("S3: '{s3}'\nS4: '{s4}'");
48 println!("S2[2..=43]: {}", &s2[2 ..= 3]);
49
50 println!("========================================");
51
52 let s21 = TokenString::try_from("Hello, ").unwrap();
53 let s22 = TokenString::try_from("world!").unwrap();
54
55 let mut builder = Builder::<'_, 2>::new(&s21);
56
57 // Create the new `TokenString`. An error may be returned.
58 let s21_s22 = builder.concat(&s22).collect().unwrap();
59
60 // Check, if the result is actually "Hello, world!".
61 println!("S11 + S22:\n'{s21_s22}'\nshould be:\n'Hello, world!'");
62
63 println!("========================================");
64 let mut b = Builder::<'_, 64>::new(&s3);
65 println!("Only S3: {b}");
66 let c = b.concat(&s3).concat(&s3).unwrap();
67 println!("3x S3: {c}");
68 let s5 = c.collect_checked().unwrap();
69 println!("S5: {s5:?}");
70
71 println!("========================================");
72 let s6 = TokenString::try_from("1").unwrap();
73 let s7: TokenString = "2".try_into().unwrap();
74 let mut d = Builder::<'_, 64>::new(&s2);
75 println!("Only S2: {d}");
76 let e = d.concat(&s6).concat(&s7).unwrap();
77 println!("S2 + S6 + S7: {e}");
78 let s8 = e.collect_checked().unwrap();
79 println!("S8: {s8:?}");
80
81 println!("========================================");
82 let s9 = TokenString::try_from("3").unwrap();
83 let s10: TokenString = "4".try_into().unwrap();
84 let s11 = Builder::<'_, 64>::new(&s6)
85 .concat(&s7)
86 .concat(&s9)
87 .concat(&s10)
88 .collect()
89 .unwrap();
90 println!("S11: {s11:?}");
91
92 println!("========================================");
93 let s12 = token_string::concat!(
94 &s6,
95 &s7,
96 &s9,
97 &s10,
98 &TokenString::try_from("asd").unwrap()
99 )
100 .unwrap();
101 println!("S12: {s12:?}");
102}