From 67cdcc2e12118becb823e20a40cc2687f2b8425a Mon Sep 17 00:00:00 2001 From: Adam Carpenter <53hornet@gmail.com> Date: Wed, 27 Mar 2019 15:32:37 -0400 Subject: Started Rust in Action MEAP. --- meap/meap-code/ch1/ch1-animals-specialization.rs | 47 ++++++++++++++++++++++++ meap/meap-code/ch1/ch1-animals-tuple-structs.rs | 41 +++++++++++++++++++++ meap/meap-code/ch1/ch1-animals.rs | 41 +++++++++++++++++++++ meap/meap-code/ch1/ch1-escape-html.rs | 22 +++++++++++ meap/meap-code/ch1/ch1-hashmap-hashset.rs | 33 +++++++++++++++++ meap/meap-code/ch1/ch1-hello2.rs | 16 ++++++++ meap/meap-code/ch1/ch1-save-user-data.rs | 32 ++++++++++++++++ meap/meap-code/ch1/ch1-time-api/Cargo.toml | 16 ++++++++ meap/meap-code/ch1/ch1-time-api/src/main.rs | 36 ++++++++++++++++++ meap/meap-code/ch1/ch1-word-counts.rs | 16 ++++++++ 10 files changed, 300 insertions(+) create mode 100644 meap/meap-code/ch1/ch1-animals-specialization.rs create mode 100644 meap/meap-code/ch1/ch1-animals-tuple-structs.rs create mode 100644 meap/meap-code/ch1/ch1-animals.rs create mode 100644 meap/meap-code/ch1/ch1-escape-html.rs create mode 100644 meap/meap-code/ch1/ch1-hashmap-hashset.rs create mode 100644 meap/meap-code/ch1/ch1-hello2.rs create mode 100644 meap/meap-code/ch1/ch1-save-user-data.rs create mode 100644 meap/meap-code/ch1/ch1-time-api/Cargo.toml create mode 100644 meap/meap-code/ch1/ch1-time-api/src/main.rs create mode 100644 meap/meap-code/ch1/ch1-word-counts.rs (limited to 'meap/meap-code/ch1') diff --git a/meap/meap-code/ch1/ch1-animals-specialization.rs b/meap/meap-code/ch1/ch1-animals-specialization.rs new file mode 100644 index 0000000..49fc0eb --- /dev/null +++ b/meap/meap-code/ch1/ch1-animals-specialization.rs @@ -0,0 +1,47 @@ +struct Animal { + age: i32, +} + +type Cat = Animal; +type Dog = Animal; +type LoudDog = Dog; + +trait Talk { + fn talk(&self) -> (); +} + +impl Talk for Animal { + default fn talk(&self) { // note the use of the default + println!(""); + } +} + +impl Talk for Cat { + fn talk(&self) { + println!("Meow"); + } +} + +impl Talk for Dog { + fn talk(&self) { + println!("Woof!"); + } +} + +impl Talk for LoudDog { + fn talk(&self) { + println!("WOOF!!"); + } +} + + + +fn main() { + let fluffy = Cat(Animal { age: 4 }); + let max = Dog(Animal { age: 2 }); + let neighbours_dog = LoudDog(Animal { age: 7 }); + + fluffy.talk(); + max.talk(); + neighbours_dog.talk(); +} diff --git a/meap/meap-code/ch1/ch1-animals-tuple-structs.rs b/meap/meap-code/ch1/ch1-animals-tuple-structs.rs new file mode 100644 index 0000000..ed479ed --- /dev/null +++ b/meap/meap-code/ch1/ch1-animals-tuple-structs.rs @@ -0,0 +1,41 @@ +struct Animal { + age: i32, +} + +struct Cat(Animal); +struct Dog(Animal); +struct LoudDog(Animal); + +trait Talk { + fn talk(&self) -> (); +} + +impl Talk for Cat { + fn talk(&self) { + println!("Meow"); + } +} + +impl Talk for Dog { + fn talk(&self) { + println!("Woof!"); + } +} + +impl Talk for LoudDog { + fn talk(&self) { + println!("WOOF!!"); + } +} + + + +fn main() { + let fluffy = Cat(Animal { age: 4 }); + let max = Dog(Animal { age: 2 }); + let neighbours_dog = LoudDog(Animal { age: 7 }); + + fluffy.talk(); + max.talk(); + neighbours_dog.talk(); +} diff --git a/meap/meap-code/ch1/ch1-animals.rs b/meap/meap-code/ch1/ch1-animals.rs new file mode 100644 index 0000000..ed479ed --- /dev/null +++ b/meap/meap-code/ch1/ch1-animals.rs @@ -0,0 +1,41 @@ +struct Animal { + age: i32, +} + +struct Cat(Animal); +struct Dog(Animal); +struct LoudDog(Animal); + +trait Talk { + fn talk(&self) -> (); +} + +impl Talk for Cat { + fn talk(&self) { + println!("Meow"); + } +} + +impl Talk for Dog { + fn talk(&self) { + println!("Woof!"); + } +} + +impl Talk for LoudDog { + fn talk(&self) { + println!("WOOF!!"); + } +} + + + +fn main() { + let fluffy = Cat(Animal { age: 4 }); + let max = Dog(Animal { age: 2 }); + let neighbours_dog = LoudDog(Animal { age: 7 }); + + fluffy.talk(); + max.talk(); + neighbours_dog.talk(); +} diff --git a/meap/meap-code/ch1/ch1-escape-html.rs b/meap/meap-code/ch1/ch1-escape-html.rs new file mode 100644 index 0000000..7b61232 --- /dev/null +++ b/meap/meap-code/ch1/ch1-escape-html.rs @@ -0,0 +1,22 @@ +fn escape_html(maybe_html: &str) -> String { + let mut out = String::with_capacity(maybe_html.len()); + + for c in maybe_html.chars() { + match c { + '<' => out.push_str("<"), + '>' => out.push_str(">"), + '&' => out.push_str("&"), + '\'' => out.push_str("'"), + '"' => out.push_str("""), + _ => out.push(c), + }; + } + + out +} + +fn main() { + let html = "

\"Hello, World!\"

"; + let escaped_html = escape_html(html); + println!("{}", escaped_html); +} diff --git a/meap/meap-code/ch1/ch1-hashmap-hashset.rs b/meap/meap-code/ch1/ch1-hashmap-hashset.rs new file mode 100644 index 0000000..1fa9229 --- /dev/null +++ b/meap/meap-code/ch1/ch1-hashmap-hashset.rs @@ -0,0 +1,33 @@ +use std::collections::{HashMap, HashSet}; + +fn main() { + + let input_text = "does this work + i dont know + how rust works"; + + let mut character_counts = HashMap::new(); + + let mut n_lines = 0u32; + + for l in input_text.lines() { + n_lines = n_lines + 1; + + let mut chars_for_line = HashSet::new(); + + for c in l.chars() { + if chars_for_line.contains(&c) { + continue + } + let c_count = character_counts.entry(c).or_insert(0u32); + *c_count += 1; + chars_for_line.insert(c); + } + } + + for (c, c_count) in &character_counts { + if *c_count == n_lines { + println!("{}", c); + } + } +} diff --git a/meap/meap-code/ch1/ch1-hello2.rs b/meap/meap-code/ch1/ch1-hello2.rs new file mode 100644 index 0000000..c804513 --- /dev/null +++ b/meap/meap-code/ch1/ch1-hello2.rs @@ -0,0 +1,16 @@ +fn greet_world() { + println!("Hello, world!"); // our old friend. + + let southern_germany = "Grüß Gott!"; + let japan = "ハロー・ワールド"; + + let regions = [southern_germany, japan]; + + for region in regions.iter() { + println!("{}", ®ion); + } +} + +fn main() { + greet_world(); +} \ No newline at end of file diff --git a/meap/meap-code/ch1/ch1-save-user-data.rs b/meap/meap-code/ch1/ch1-save-user-data.rs new file mode 100644 index 0000000..48f8130 --- /dev/null +++ b/meap/meap-code/ch1/ch1-save-user-data.rs @@ -0,0 +1,32 @@ +use std::str; + +#[derive(Debug)] +struct User { + id: u8, + secret: String, +} + +fn store_secrets(user: &User, buffer: &mut[u8]) { + let _secret = user.secret.clone(); + + + // assume we're writing to a database + println!("{:?}: {}", user, str::from_utf8(&buffer).unwrap()); +} + +fn main() { + let buffer = &mut[0u8; 1024]; + let u1 = User { + id: 1, + secret: String::from("Pa55w0rd!"), + }; + let u2 = User { + id: 2, + secret: String::from("correct horse battery staple"), + }; + + store_secrets(&u1, buffer); + store_secrets(&u2, buffer); + + +} \ No newline at end of file diff --git a/meap/meap-code/ch1/ch1-time-api/Cargo.toml b/meap/meap-code/ch1/ch1-time-api/Cargo.toml new file mode 100644 index 0000000..da28bde --- /dev/null +++ b/meap/meap-code/ch1/ch1-time-api/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "ch1-time-api" +version = "0.1.0" +authors = ["Tim McNamara "] + +[dependencies] +chrono = "0.4.0" +rocket = "0.3.0" +rocket_codegen = "0.3.0" +serde = "1.0" +serde_derive = "1.0" + +[dependencies.rocket_contrib] +version = "0.3.0" +default-features = false +features = ["json"] \ No newline at end of file diff --git a/meap/meap-code/ch1/ch1-time-api/src/main.rs b/meap/meap-code/ch1/ch1-time-api/src/main.rs new file mode 100644 index 0000000..660c1cc --- /dev/null +++ b/meap/meap-code/ch1/ch1-time-api/src/main.rs @@ -0,0 +1,36 @@ +#![feature(plugin)] // <1> +#![plugin(rocket_codegen)] // <1> + +extern crate serde; // <2> +extern crate chrono; // <2> +extern crate rocket; // <2> +extern crate rocket_contrib; // <2> + +#[macro_use] // <3> Syntax to indicate that we want to import macros from another module +extern crate serde_derive; // <3> + +use chrono::prelude::*; // <4> brings all exported members into local scope (e.g. DateTime and Utc) +use rocket_contrib::{Json}; // <5> bring single member into local scope + +#[derive(Serialize)] // <6> Automatically generate a string representation of this struct (which will be used as JSON) +struct Timestamp { // <7> Syntax to create a custom type + time: String, // <8> The `Timestamp` `time` field is of type `String` +} + +#[get("/")] // <9> Custom syntax provided by the library that indicates to code generation +fn index() -> &'static str { // <10> Define a function with no arguments and its return type + "Hello, world!" // <11> Rust returns the result of the final expression +} + +#[get("/time")] +fn time_now() -> Json { + let now: DateTime = Utc::now(); + let timestamp = Timestamp { time: now.to_rfc3339() }; + Json(timestamp) +} + +fn main() { + rocket::ignite() + .mount("/", routes![index, time_now]) + .launch(); +} \ No newline at end of file diff --git a/meap/meap-code/ch1/ch1-word-counts.rs b/meap/meap-code/ch1/ch1-word-counts.rs new file mode 100644 index 0000000..fc5c8ea --- /dev/null +++ b/meap/meap-code/ch1/ch1-word-counts.rs @@ -0,0 +1,16 @@ +use std::collections::HashMap; + +fn main() { + let text = "once upon a time ..."; + let mut word_counts = HashMap::new(); + + let pairs = text.split(" ") + .map(|x| { (x, 1) }); + + for (word, count) in pairs { + let tmp = word_counts.entry(word) + .or_insert(0); + *tmp += count; + } + println!("{:?}", word_counts); +} -- cgit v1.2.3