From f026aa1e762803c4e784f82fd3830c9f936cf8d5 Mon Sep 17 00:00:00 2001 From: Martin Pitt Date: Tue, 24 Aug 2021 09:51:38 +0200 Subject: [PATCH] Move helper functions into src/lib.rs This enables writing integration tests. Pure binary crates can't have them: https://doc.rust-lang.org/stable/book/ch11-03-test-organization.html#integration-tests-for-binary-crates --- src/lib.rs | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 50 ++------------------------------------------------ 2 files changed, 52 insertions(+), 48 deletions(-) create mode 100644 src/lib.rs diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..b9ee526 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,50 @@ +use std::fs::File; +use std::io::prelude::*; + +pub fn read_file(path: &str) -> Result { + let mut s = String::new(); + File::open(path)? + .read_to_string(&mut s)?; + Ok(s) +} + +// needs Copy trait, good for simple types +pub fn largest(list: &[T]) -> T { + let mut result = list[0]; + for &i in list { + if i > result { + result = i; + } + } + result +} + +// expensive for large strings, don't use that +pub fn largest_clone(list: &[T]) -> T { + let mut result = list[0].clone(); + for i in list { + if *i > result { + result = i.clone(); + } + } + result +} + +// good for everything, but more expensive for simple types +pub fn largest_ref(list: &[T]) -> &T { + let mut result = &list[0]; + for i in list { + if i > result { + result = i; + } + } + result +} + +pub fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { + if x.len() > y.len() { + x + } else { + y + } +} diff --git a/src/main.rs b/src/main.rs index a4e4f1d..718ecb5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,11 @@ mod word_utils; +mod lib; use std::collections::HashMap; use std::io::{prelude::*, ErrorKind}; use std::fs::{self, File}; +use lib::*; use word_utils::{first_word, second_word}; fn test_strings() { @@ -69,13 +71,6 @@ fn test_hashmaps() { println!("collect_scores after rebuilding with doubling: {:?}", collect_scores); } -fn read_file(path: &str) -> Result { - let mut s = String::new(); - File::open(path)? - .read_to_string(&mut s)?; - Ok(s) -} - fn test_files() { if let Ok(mut f) = File::open("Cargo.toml") { let mut contents = String::new(); @@ -116,47 +111,6 @@ fn test_files() { } } -// needs Copy trait, good for simple types -fn largest(list: &[T]) -> T { - let mut result = list[0]; - for &i in list { - if i > result { - result = i; - } - } - result -} - -// expensive for large strings, don't use that -fn largest_clone(list: &[T]) -> T { - let mut result = list[0].clone(); - for i in list { - if *i > result { - result = i.clone(); - } - } - result -} - -// good for everything, but more expensive for simple types -fn largest_ref(list: &[T]) -> &T { - let mut result = &list[0]; - for i in list { - if i > result { - result = i; - } - } - result -} - -fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { - if x.len() > y.len() { - x - } else { - y - } -} - fn test_generics() { let num_list = vec![3, 42, -7, 100, 0]; println!("largest number: {}", largest(&num_list)); -- 2.39.2