diff options
Diffstat (limited to 'users/wpcarro/scratch/rust')
-rw-r--r-- | users/wpcarro/scratch/rust/.gitignore | 1 | ||||
-rw-r--r-- | users/wpcarro/scratch/rust/Cargo.lock | 89 | ||||
-rw-r--r-- | users/wpcarro/scratch/rust/Cargo.toml | 8 | ||||
-rw-r--r-- | users/wpcarro/scratch/rust/README.md | 11 | ||||
-rw-r--r-- | users/wpcarro/scratch/rust/shell.nix | 7 | ||||
-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 | 15 | ||||
-rw-r--r-- | users/wpcarro/scratch/rust/src/rc/mod.rs | 12 | ||||
-rw-r--r-- | users/wpcarro/scratch/rust/src/stdin/mod.rs | 22 |
10 files changed, 259 insertions, 0 deletions
diff --git a/users/wpcarro/scratch/rust/.gitignore b/users/wpcarro/scratch/rust/.gitignore new file mode 100644 index 000000000000..9f970225adb6 --- /dev/null +++ b/users/wpcarro/scratch/rust/.gitignore @@ -0,0 +1 @@ +target/ \ No newline at end of file diff --git a/users/wpcarro/scratch/rust/Cargo.lock b/users/wpcarro/scratch/rust/Cargo.lock new file mode 100644 index 000000000000..28aa1250cea4 --- /dev/null +++ b/users/wpcarro/scratch/rust/Cargo.lock @@ -0,0 +1,89 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "itoa" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" + +[[package]] +name = "proc-macro2" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rust" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "ryu" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" + +[[package]] +name = "serde" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "syn" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" diff --git a/users/wpcarro/scratch/rust/Cargo.toml b/users/wpcarro/scratch/rust/Cargo.toml new file mode 100644 index 000000000000..76235d11d37d --- /dev/null +++ b/users/wpcarro/scratch/rust/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "rust" +version = "0.1.0" +edition = "2021" + +[dependencies] +serde_json = "1.0.81" +serde = { version = "1.0.137", features = ["derive"] } diff --git a/users/wpcarro/scratch/rust/README.md b/users/wpcarro/scratch/rust/README.md new file mode 100644 index 000000000000..9ff7dd97eaf6 --- /dev/null +++ b/users/wpcarro/scratch/rust/README.md @@ -0,0 +1,11 @@ +# Rust + +Watch me fumble around as I learn Rust. + +## Usage + +```shell +$ nix-shell /depot -A users.wpcarro.scratch.rust +$ cargo new json && cd ./json +$ cargo run json +``` diff --git a/users/wpcarro/scratch/rust/shell.nix b/users/wpcarro/scratch/rust/shell.nix new file mode 100644 index 000000000000..98e2dbf4b29b --- /dev/null +++ b/users/wpcarro/scratch/rust/shell.nix @@ -0,0 +1,7 @@ +{ pkgs ? import <nixpkgs> { }, ... }: + +pkgs.mkShell { + buildInputs = [ + pkgs.cargo + ]; +} 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..671b33093050 --- /dev/null +++ b/users/wpcarro/scratch/rust/src/main.rs @@ -0,0 +1,15 @@ +use serde::{Deserialize, Serialize}; +use serde_json::{json, Value}; + +mod display; +mod json; +mod rc; +mod stdin; + +//////////////////////////////////////////////////////////////////////////////// +// Main +//////////////////////////////////////////////////////////////////////////////// + +fn main() { + rc::example(); +} diff --git a/users/wpcarro/scratch/rust/src/rc/mod.rs b/users/wpcarro/scratch/rust/src/rc/mod.rs new file mode 100644 index 000000000000..67251ca6aa9b --- /dev/null +++ b/users/wpcarro/scratch/rust/src/rc/mod.rs @@ -0,0 +1,12 @@ +// Playing around with Rust's "smart pointers". Starting off with a wrapper type +// that allows multiple readers (owners?) of some data. + +use std::rc::Rc; + +pub fn example() { + let five = Rc::new(5); + let x = Rc::clone(&five); + let y = Rc::clone(&five); + let z = Rc::clone(&five); + println!("result: {}", *x + *y + *z) +} diff --git a/users/wpcarro/scratch/rust/src/stdin/mod.rs b/users/wpcarro/scratch/rust/src/stdin/mod.rs new file mode 100644 index 000000000000..4be95afa4547 --- /dev/null +++ b/users/wpcarro/scratch/rust/src/stdin/mod.rs @@ -0,0 +1,22 @@ +use std::io::Write; +use std::process::{Command, Stdio}; + +// Example of piping-in a string defined in Rust to a shell command. +pub fn example() { + let input = "Hello, world!"; + + let mut cat = Command::new("cat") + .stdin(Stdio::piped()) + .spawn() + .ok() + .unwrap(); + + cat.stdin + .take() + .unwrap() + .write_all(&input.as_bytes()) + .unwrap(); + + let output = cat.wait_with_output().unwrap(); + println!("{}", String::from_utf8_lossy(&output.stdout)); +} |