diff options
author | William Carroll <wpcarro@gmail.com> | 2022-08-09T17·20-0700 |
---|---|---|
committer | clbot <clbot@tvl.fyi> | 2022-08-09T17·22+0000 |
commit | 4732603a42c76ea53ab6a4d7358380f4d0194c48 (patch) | |
tree | 97d79231f08d99dd89cae79d799c6c48bd5b1bd6 /users/wpcarro/scratch/rust/src | |
parent | 783e1190cdbc1a5fe60f5c5cc1dc3a9861ee138f (diff) |
feat(wpcarro/rust): Include std::fmt::Display example r/4396
Gotta know how to `to_string` things Change-Id: I259ef61ecaf6ae7fabe0b3d211706ba5f429b3a7 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6057 Reviewed-by: wpcarro <wpcarro@gmail.com> Autosubmit: wpcarro <wpcarro@gmail.com> Tested-by: BuildkiteCI
Diffstat (limited to 'users/wpcarro/scratch/rust/src')
-rw-r--r-- | users/wpcarro/scratch/rust/src/display/mod.rs | 13 | ||||
-rw-r--r-- | users/wpcarro/scratch/rust/src/json/mod.rs | 81 | ||||
-rw-r--r-- | users/wpcarro/scratch/rust/src/main.rs | 18 |
3 files changed, 112 insertions, 0 deletions
diff --git a/users/wpcarro/scratch/rust/src/display/mod.rs b/users/wpcarro/scratch/rust/src/display/mod.rs new file mode 100644 index 000000000000..838463109190 --- /dev/null +++ b/users/wpcarro/scratch/rust/src/display/mod.rs @@ -0,0 +1,13 @@ +use std::fmt; + +pub struct Person { + pub fname: String, + pub lname: String, + pub age: i8, +} + +impl fmt::Display for Person { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}, {} ({} years old)", self.lname, self.fname, self.age) + } +} diff --git a/users/wpcarro/scratch/rust/src/json/mod.rs b/users/wpcarro/scratch/rust/src/json/mod.rs new file mode 100644 index 000000000000..d3307b394ea4 --- /dev/null +++ b/users/wpcarro/scratch/rust/src/json/mod.rs @@ -0,0 +1,81 @@ +use serde::{Deserialize, Serialize}; +use serde_json::{json, Value}; + +// From the serde_json docs: +// +// > There are three common ways that you might find yourself needing to work +// > with JSON data in Rust. +// > +// > 1. As text data. An unprocessed string of JSON data that you receive on an +// > HTTP endpoint, read from a file, or prepare to send to a remote server. +// > 2. As an untyped or loosely typed representation. Maybe you want to check +// > that some JSON data is valid before passing it on, but without knowing +// > the structure of what it contains. Or you want to do very basic +// > manipulations like insert a key in a particular spot. +// > 3. As a strongly typed Rust data structure. When you expect all or most of +// > your data to conform to a particular structure and want to get real work +// > done without JSON’s loosey-goosey nature tripping you up. +// +// So let's take a look at all three... + +//////////////////////////////////////////////////////////////////////////////// +// Types +//////////////////////////////////////////////////////////////////////////////// + +#[derive(Serialize, Deserialize, Debug)] +struct Person { + fname: String, + lname: String, + age: u8, +} + +//////////////////////////////////////////////////////////////////////////////// +// Functions +//////////////////////////////////////////////////////////////////////////////// + +// 1) Reading/writing from/to plain text. +// TL;DR: +// - read: serde_json::from_str(data) +// - write: x.to_string() +pub fn one() { + let data = json!({ + "fname": "William", + "lname": "Carroll", + "age": 30, + }) + .to_string(); + + println!("result: {:?}", data); +} + +// 2) Parse into a loosely typed representation; mutate it; serialize it back. +// TL;DR: +// - read: serde_json::from_str(data) +// - write: x.to_string() +pub fn two() { + let data = r#"{"fname":"William","lname":"Carroll","age":30}"#; + + let mut parsed: Value = serde_json::from_str(data).unwrap(); + parsed["fname"] = json!("Norm"); + parsed["lname"] = json!("Macdonald"); + parsed["age"] = json!(61); + + let result = parsed.to_string(); + println!("result: {:?}", result); +} + +// 3) Parse into a strongly typed structure. +// TL;DR: +// - read: serde_json::from_str(data) +// - write: serde_json::to_string(x).unwrap() +pub fn three() { + let data = r#"{"fname":"William","lname":"Carroll","age":30}"#; + + let mut read: Person = serde_json::from_str(data).unwrap(); + read.fname = "Norm".to_string(); + read.lname = "Macdonald".to_string(); + read.age = 61; + + let write = serde_json::to_string(&read).unwrap(); + println!("result: {:?}", write); +} diff --git a/users/wpcarro/scratch/rust/src/main.rs b/users/wpcarro/scratch/rust/src/main.rs new file mode 100644 index 000000000000..da9e3d3c637c --- /dev/null +++ b/users/wpcarro/scratch/rust/src/main.rs @@ -0,0 +1,18 @@ +use serde::{Deserialize, Serialize}; +use serde_json::{json, Value}; + +mod display; +mod json; + +//////////////////////////////////////////////////////////////////////////////// +// Main +//////////////////////////////////////////////////////////////////////////////// + +fn main() { + let john: display::Person = display::Person { + fname: "John".to_string(), + lname: "Cleese".to_string(), + age: 82, + }; + println!("Person: {}", john) +} |