diff --git a/ch10/extract_fn b/ch10/extract_fn new file mode 100755 index 0000000..847d90d Binary files /dev/null and b/ch10/extract_fn differ diff --git a/ch10/extract_fn.rs b/ch10/extract_fn.rs new file mode 100644 index 0000000..5995935 --- /dev/null +++ b/ch10/extract_fn.rs @@ -0,0 +1,21 @@ +fn largest(list: &[i32]) -> &i32 { + let mut largest = &list[0]; + + for num in list { + if num > largest { + largest = num; + } + } + + largest +} + +fn main() { + let number_list = vec![30, 52, 12, 69, 23, 50]; + let large = largest(&number_list); + println!("Largest: {large}"); + + let number_list = vec![130, 52, 12, 69, 23, 50]; + let large = largest(&number_list); + println!("Largest: {large}"); +} diff --git a/ch10/lifetime_hypotheses b/ch10/lifetime_hypotheses new file mode 100755 index 0000000..80ca7e0 Binary files /dev/null and b/ch10/lifetime_hypotheses differ diff --git a/ch10/lifetime_hypotheses.rs b/ch10/lifetime_hypotheses.rs new file mode 100644 index 0000000..cb7a050 --- /dev/null +++ b/ch10/lifetime_hypotheses.rs @@ -0,0 +1,22 @@ +use std::io; + +fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { + if x.len() > y.len() { x } else { y } +} + +fn brap<'b>(x: &'b str, y: &str) -> &'b str { + if x.len() > y.len() { x } else { "henkieeeeee" } +} + +fn main() { + let stronk = String::from("stronkman"); + + let ln; + { + let stonks = "stonks"; + let mut inp = String::new(); + io::stdin().read_line(&mut inp).expect("Please input a name"); + ln = longest(&inp, brap(stronk.as_str(), stonks)); + } + println!("The longest of them all: {}", ln); +} diff --git a/ch10/trait_blanket_implementation b/ch10/trait_blanket_implementation new file mode 100755 index 0000000..e1db53a Binary files /dev/null and b/ch10/trait_blanket_implementation differ diff --git a/ch10/trait_blanket_implementation.rs b/ch10/trait_blanket_implementation.rs new file mode 100644 index 0000000..7c93b3f --- /dev/null +++ b/ch10/trait_blanket_implementation.rs @@ -0,0 +1,29 @@ +trait Named { + fn say_name(&self) -> String; +} + +trait Bold { + fn write_bold(&self); +} + +impl Bold for T { + fn write_bold(&self) { + println!("!bold {}", self.say_name()) + } +} + +struct Person { + name: String, +} + +impl Named for Person { + fn say_name(&self) -> String { + self.name.clone() + } +} + +fn main() { + let p = Person{name: String::from("Jasper")}; + + p.write_bold(); +} diff --git a/ch11/adder/Cargo.lock b/ch11/adder/Cargo.lock new file mode 100644 index 0000000..efe4e14 --- /dev/null +++ b/ch11/adder/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adder" +version = "0.1.0" diff --git a/ch11/adder/Cargo.toml b/ch11/adder/Cargo.toml new file mode 100644 index 0000000..9a5826a --- /dev/null +++ b/ch11/adder/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "adder" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/ch11/adder/src/lib.rs b/ch11/adder/src/lib.rs new file mode 100644 index 0000000..818a362 --- /dev/null +++ b/ch11/adder/src/lib.rs @@ -0,0 +1,31 @@ +pub fn add(left: u64, right: u64) -> u64 { + left + right +} + +#[derive(Debug)] +struct Rectangle { + width: u32, + height: u32, +} + +impl Rectangle { + fn can_hold(&self, other: &Rectangle) -> bool { + self.width >= other.width && self.height >= other.height + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn explore() { + let result = add(2, 2); + assert_eq!(result, 4); + } + + #[test] + fn another() { + panic!("Fail!") + } +} diff --git a/ch12-io-project/minigrep/Cargo.lock b/ch12-io-project/minigrep/Cargo.lock new file mode 100644 index 0000000..1511dd5 --- /dev/null +++ b/ch12-io-project/minigrep/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "minigrep" +version = "0.1.0" diff --git a/ch12-io-project/minigrep/Cargo.toml b/ch12-io-project/minigrep/Cargo.toml new file mode 100644 index 0000000..b8302ae --- /dev/null +++ b/ch12-io-project/minigrep/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "minigrep" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/ch12-io-project/minigrep/output.txt b/ch12-io-project/minigrep/output.txt new file mode 100644 index 0000000..5b34572 --- /dev/null +++ b/ch12-io-project/minigrep/output.txt @@ -0,0 +1 @@ +To tell your name the livelong day diff --git a/ch12-io-project/minigrep/poem.txt b/ch12-io-project/minigrep/poem.txt new file mode 100644 index 0000000..8707527 --- /dev/null +++ b/ch12-io-project/minigrep/poem.txt @@ -0,0 +1,9 @@ +I'm nobody! Who are you? +Are you nobody, too? +Then there's a pair of us - don't tell! +They'd banish us, you know. + +How dreary to be somebody! +How public, like a frog +To tell your name the livelong day +To an admiring bog! diff --git a/ch12-io-project/minigrep/src/lib.rs b/ch12-io-project/minigrep/src/lib.rs new file mode 100644 index 0000000..f43d5c7 --- /dev/null +++ b/ch12-io-project/minigrep/src/lib.rs @@ -0,0 +1,55 @@ +pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { + let mut results = Vec::new(); + + for line in contents.lines() { + if line.contains(query) { + results.push(line); + } + } + + results +} + +pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { + let mut results = Vec::new(); + let query = query.to_lowercase(); + + for line in contents.lines() { + if line.to_lowercase().contains(&query) { + results.push(line); + } + } + + results +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn case_sensitive() { + let query = "duct"; + let contents = "\ +Rust: +safe, fast, productive. +Pick three. +Duct tape. + "; + + assert_eq!(vec!["safe, fast, productive."], search(query, contents)); + } + + #[test] + fn case_insensitive() { + let query = "rUsT"; + let contents = "\ +Rust: +safe, fast, productive. +Pick three. +Trust me. + "; + + assert_eq!(vec!["Rust:", "Trust me."], search_case_insensitive(query, contents)); + } +} diff --git a/ch12-io-project/minigrep/src/main.rs b/ch12-io-project/minigrep/src/main.rs new file mode 100644 index 0000000..cade4a3 --- /dev/null +++ b/ch12-io-project/minigrep/src/main.rs @@ -0,0 +1,55 @@ +use std::env; +use std::fs; +use std::process; +use std::error::Error; + +use minigrep::{search, search_case_insensitive}; + +fn main() { + let args: Vec = env::args().collect(); + let config = Config::build(&args).unwrap_or_else(|err| { + eprintln!("problem parsing arguments: {}", err); + process::exit(1); + }); + + if let Err(e) = run(config) { + eprintln!("problem running program: {}", e); + process::exit(1); + } +} + +struct Config { + query: String, + file_path: String, + ignore_case: bool, +} + +impl Config { + fn build(args: &[String]) -> Result { + if args.len() < 3 { + return Err("not enough arguments"); + } + + let query = args[1].clone(); + let file_path = args[2].clone(); + let ignore_case = env::var("IGNORE_CASE").is_ok(); + + Ok(Config{ query, file_path, ignore_case }) + } +} + +fn run(config: Config) -> Result<(), Box> { + let contents = fs::read_to_string(config.file_path)?; + + let results = if config.ignore_case { + search_case_insensitive(&config.query, &contents) + } else { + search(&config.query, &contents) + }; + + for line in results { + println!("{line}"); + } + + Ok(()) +}