summaryrefslogtreecommitdiffstats
path: root/vendor/writeable/examples/writeable_message.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/writeable/examples/writeable_message.rs')
-rw-r--r--vendor/writeable/examples/writeable_message.rs60
1 files changed, 60 insertions, 0 deletions
diff --git a/vendor/writeable/examples/writeable_message.rs b/vendor/writeable/examples/writeable_message.rs
new file mode 100644
index 000000000..b342fdb26
--- /dev/null
+++ b/vendor/writeable/examples/writeable_message.rs
@@ -0,0 +1,60 @@
+// This file is part of ICU4X. For terms of use, please see the file
+// called LICENSE at the top level of the ICU4X source tree
+// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
+
+// This example illustrates a very simple type implementing Writeable.
+icu_benchmark_macros::static_setup!();
+
+use std::fmt;
+use writeable::*;
+
+struct WriteableMessage<W: Writeable>(W);
+
+const GREETING: Part = Part {
+ category: "meaning",
+ value: "greeting",
+};
+
+const EMOJI: Part = Part {
+ category: "meaning",
+ value: "emoji",
+};
+
+impl<V: Writeable> Writeable for WriteableMessage<V> {
+ fn write_to_parts<W: PartsWrite + ?Sized>(&self, sink: &mut W) -> fmt::Result {
+ use fmt::Write;
+ sink.with_part(GREETING, |g| {
+ g.write_str("Hello")?;
+ g.write_str(" ")?;
+ self.0.write_to(g)
+ })?;
+ sink.write_char(' ')?;
+ sink.with_part(EMOJI, |e| e.write_char('😅'))
+ }
+
+ fn writeable_length_hint(&self) -> LengthHint {
+ LengthHint::exact(11) + self.0.writeable_length_hint()
+ }
+}
+
+impl<V: Writeable> fmt::Display for WriteableMessage<V> {
+ #[inline]
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ self.write_to(f)
+ }
+}
+
+fn main() {
+ icu_benchmark_macros::main_setup!();
+
+ let (string, parts) = writeable_to_parts_for_test(&WriteableMessage("world")).unwrap();
+
+ assert_eq!(string, "Hello world 😅");
+
+ // Print the greeting only
+ let (start, end, _) = parts
+ .into_iter()
+ .find(|(_, _, part)| part == &GREETING)
+ .unwrap();
+ println!("{}", &string[start..end]);
+}