Add iterator/closure updated version of minigrep example
This commit is contained in:
parent
d4835dc6b8
commit
b10c01f40c
1
.idea/misc.xml
generated
1
.idea/misc.xml
generated
@ -22,6 +22,7 @@
|
|||||||
<cargoProject FILE="$PROJECT_DIR$/adder/Cargo.toml" />
|
<cargoProject FILE="$PROJECT_DIR$/adder/Cargo.toml" />
|
||||||
<cargoProject FILE="$PROJECT_DIR$/minigrep/Cargo.toml" />
|
<cargoProject FILE="$PROJECT_DIR$/minigrep/Cargo.toml" />
|
||||||
<cargoProject FILE="$PROJECT_DIR$/closures/Cargo.toml" />
|
<cargoProject FILE="$PROJECT_DIR$/closures/Cargo.toml" />
|
||||||
|
<cargoProject FILE="$PROJECT_DIR$/minigrep_v2/Cargo.toml" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ComposerJsonPluginSettings">
|
<component name="ComposerJsonPluginSettings">
|
||||||
<unboundedVersionInspectionSettings>
|
<unboundedVersionInspectionSettings>
|
||||||
|
5
.idea/rust.iml
generated
5
.idea/rust.iml
generated
@ -86,6 +86,10 @@
|
|||||||
<sourceFolder url="file://$MODULE_DIR$/closures/examples" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/closures/examples" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/closures/tests" isTestSource="true" />
|
<sourceFolder url="file://$MODULE_DIR$/closures/tests" isTestSource="true" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/closures/benches" isTestSource="true" />
|
<sourceFolder url="file://$MODULE_DIR$/closures/benches" isTestSource="true" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/minigrep_v2/src" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/minigrep_v2/examples" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/minigrep_v2/tests" isTestSource="true" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/minigrep_v2/benches" isTestSource="true" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/adder/target" />
|
<excludeFolder url="file://$MODULE_DIR$/adder/target" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/branches/target" />
|
<excludeFolder url="file://$MODULE_DIR$/branches/target" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/closures/target" />
|
<excludeFolder url="file://$MODULE_DIR$/closures/target" />
|
||||||
@ -99,6 +103,7 @@
|
|||||||
<excludeFolder url="file://$MODULE_DIR$/lifetimes/target" />
|
<excludeFolder url="file://$MODULE_DIR$/lifetimes/target" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/loops/target" />
|
<excludeFolder url="file://$MODULE_DIR$/loops/target" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/minigrep/target" />
|
<excludeFolder url="file://$MODULE_DIR$/minigrep/target" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/minigrep_v2/target" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/modules/target" />
|
<excludeFolder url="file://$MODULE_DIR$/modules/target" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/rectangles/target" />
|
<excludeFolder url="file://$MODULE_DIR$/rectangles/target" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/references/target" />
|
<excludeFolder url="file://$MODULE_DIR$/references/target" />
|
||||||
|
91
.idea/workspace.xml
generated
91
.idea/workspace.xml
generated
@ -2,6 +2,8 @@
|
|||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="c8f42924-1cd2-4b1c-bcff-602a3368bb16" name="Default Changelist" comment="">
|
<list default="true" id="c8f42924-1cd2-4b1c-bcff-602a3368bb16" name="Default Changelist" comment="">
|
||||||
|
<change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/.idea/rust.iml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/rust.iml" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
</list>
|
</list>
|
||||||
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
|
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
|
||||||
@ -12,15 +14,29 @@
|
|||||||
</component>
|
</component>
|
||||||
<component name="FileEditorManager">
|
<component name="FileEditorManager">
|
||||||
<leaf>
|
<leaf>
|
||||||
<file pinned="false" current-in-tab="true">
|
<file pinned="false" current-in-tab="false">
|
||||||
<entry file="file://$PROJECT_DIR$/closures/src/lib.rs">
|
<entry file="file://$PROJECT_DIR$/minigrep_v2/Cargo.toml">
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
<state relative-caret-position="1165">
|
<state relative-caret-position="112">
|
||||||
<caret line="74" column="1" selection-start-line="74" selection-start-column="1" selection-end-line="74" selection-end-column="1" />
|
<caret line="7" selection-start-line="7" selection-end-line="7" />
|
||||||
<folding>
|
</state>
|
||||||
<element signature="e#437#438#0" expanded="true" />
|
</provider>
|
||||||
<element signature="e#472#473#0" expanded="true" />
|
</entry>
|
||||||
</folding>
|
</file>
|
||||||
|
<file pinned="false" current-in-tab="false">
|
||||||
|
<entry file="file://$PROJECT_DIR$/minigrep_v2/src/main.rs">
|
||||||
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
|
<state relative-caret-position="272">
|
||||||
|
<caret line="17" lean-forward="true" selection-start-line="17" selection-end-line="17" />
|
||||||
|
</state>
|
||||||
|
</provider>
|
||||||
|
</entry>
|
||||||
|
</file>
|
||||||
|
<file pinned="false" current-in-tab="true">
|
||||||
|
<entry file="file://$PROJECT_DIR$/minigrep_v2/src/lib.rs">
|
||||||
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
|
<state relative-caret-position="960">
|
||||||
|
<caret line="60" column="40" selection-start-line="60" selection-start-column="40" selection-end-line="60" selection-end-column="40" />
|
||||||
</state>
|
</state>
|
||||||
</provider>
|
</provider>
|
||||||
</entry>
|
</entry>
|
||||||
@ -85,6 +101,8 @@
|
|||||||
<option value="$PROJECT_DIR$/minigrep/src/main.rs" />
|
<option value="$PROJECT_DIR$/minigrep/src/main.rs" />
|
||||||
<option value="$PROJECT_DIR$/closures/src/main.rs" />
|
<option value="$PROJECT_DIR$/closures/src/main.rs" />
|
||||||
<option value="$PROJECT_DIR$/closures/src/lib.rs" />
|
<option value="$PROJECT_DIR$/closures/src/lib.rs" />
|
||||||
|
<option value="$PROJECT_DIR$/minigrep_v2/src/main.rs" />
|
||||||
|
<option value="$PROJECT_DIR$/minigrep_v2/src/lib.rs" />
|
||||||
</list>
|
</list>
|
||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
@ -118,12 +136,17 @@
|
|||||||
<path>
|
<path>
|
||||||
<item name="rust" type="3d21c010:ScopeViewTreeModel$ProjectNode" />
|
<item name="rust" type="3d21c010:ScopeViewTreeModel$ProjectNode" />
|
||||||
<item name="rust" type="2674bda8:ScopeViewTreeModel$GroupNode" />
|
<item name="rust" type="2674bda8:ScopeViewTreeModel$GroupNode" />
|
||||||
<item name="closures" type="9f88c78c:ScopeViewTreeModel$FileNode" />
|
<item name="minigrep" type="9f88c78c:ScopeViewTreeModel$FileNode" />
|
||||||
</path>
|
</path>
|
||||||
<path>
|
<path>
|
||||||
<item name="rust" type="3d21c010:ScopeViewTreeModel$ProjectNode" />
|
<item name="rust" type="3d21c010:ScopeViewTreeModel$ProjectNode" />
|
||||||
<item name="rust" type="2674bda8:ScopeViewTreeModel$GroupNode" />
|
<item name="rust" type="2674bda8:ScopeViewTreeModel$GroupNode" />
|
||||||
<item name="closures" type="9f88c78c:ScopeViewTreeModel$FileNode" />
|
<item name="minigrep_v2" type="9f88c78c:ScopeViewTreeModel$FileNode" />
|
||||||
|
</path>
|
||||||
|
<path>
|
||||||
|
<item name="rust" type="3d21c010:ScopeViewTreeModel$ProjectNode" />
|
||||||
|
<item name="rust" type="2674bda8:ScopeViewTreeModel$GroupNode" />
|
||||||
|
<item name="minigrep_v2" type="9f88c78c:ScopeViewTreeModel$FileNode" />
|
||||||
<item name="src" type="9f88c78c:ScopeViewTreeModel$FileNode" />
|
<item name="src" type="9f88c78c:ScopeViewTreeModel$FileNode" />
|
||||||
</path>
|
</path>
|
||||||
</expand>
|
</expand>
|
||||||
@ -157,7 +180,7 @@
|
|||||||
</component>
|
</component>
|
||||||
<component name="PropertiesComponent">
|
<component name="PropertiesComponent">
|
||||||
<property name="JavaScriptWeakerCompletionTypeGuess" value="true" />
|
<property name="JavaScriptWeakerCompletionTypeGuess" value="true" />
|
||||||
<property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1549055111185" />
|
<property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1549056665919" />
|
||||||
<property name="javascript.nodejs.core.library.configured.version" value="7.1.0" />
|
<property name="javascript.nodejs.core.library.configured.version" value="7.1.0" />
|
||||||
<property name="js.eslint.eslintPackage" value="$USER_HOME$/.yarn-config/global/node_modules/.bin/eslint" />
|
<property name="js.eslint.eslintPackage" value="$USER_HOME$/.yarn-config/global/node_modules/.bin/eslint" />
|
||||||
<property name="js.eslint.nodeInterpreter" value="project" />
|
<property name="js.eslint.nodeInterpreter" value="project" />
|
||||||
@ -185,7 +208,7 @@
|
|||||||
</list>
|
</list>
|
||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
<component name="RunManager" selected="Cargo Command.Test using_other_iterator_trait_methods">
|
<component name="RunManager" selected="Cargo Command.Test lib::tests (1)">
|
||||||
<configuration name="<template>" type="TestNG" default="true" selected="false">
|
<configuration name="<template>" type="TestNG" default="true" selected="false">
|
||||||
<option name="MAIN_CLASS_NAME" />
|
<option name="MAIN_CLASS_NAME" />
|
||||||
<option name="VM_PARAMETERS" value="-ea" />
|
<option name="VM_PARAMETERS" value="-ea" />
|
||||||
@ -234,13 +257,13 @@
|
|||||||
<envs />
|
<envs />
|
||||||
<method v="2" />
|
<method v="2" />
|
||||||
</configuration>
|
</configuration>
|
||||||
<configuration name="Test lib::tests" type="CargoCommandRunConfiguration" factoryName="Cargo Command" temporary="true">
|
<configuration name="Test lib::tests (1)" type="CargoCommandRunConfiguration" factoryName="Cargo Command" temporary="true">
|
||||||
<option name="channel" value="DEFAULT" />
|
<option name="channel" value="DEFAULT" />
|
||||||
<option name="command" value="test --package adder --lib tests" />
|
<option name="command" value="test --package minigrep_v2 --lib tests" />
|
||||||
<option name="allFeatures" value="false" />
|
<option name="allFeatures" value="false" />
|
||||||
<option name="nocapture" value="false" />
|
<option name="nocapture" value="false" />
|
||||||
<option name="backtrace" value="SHORT" />
|
<option name="backtrace" value="SHORT" />
|
||||||
<option name="workingDirectory" value="file://$PROJECT_DIR$/adder" />
|
<option name="workingDirectory" value="file://$PROJECT_DIR$/minigrep_v2" />
|
||||||
<envs />
|
<envs />
|
||||||
<method v="2" />
|
<method v="2" />
|
||||||
</configuration>
|
</configuration>
|
||||||
@ -263,11 +286,11 @@
|
|||||||
</configuration>
|
</configuration>
|
||||||
<recent_temporary>
|
<recent_temporary>
|
||||||
<list>
|
<list>
|
||||||
|
<item itemvalue="Cargo Command.Test lib::tests (1)" />
|
||||||
<item itemvalue="Cargo Command.Test using_other_iterator_trait_methods" />
|
<item itemvalue="Cargo Command.Test using_other_iterator_trait_methods" />
|
||||||
<item itemvalue="Cargo Command.Test calling_next_directly" />
|
<item itemvalue="Cargo Command.Test calling_next_directly" />
|
||||||
<item itemvalue="Cargo Command.Test filters_by_size" />
|
<item itemvalue="Cargo Command.Test filters_by_size" />
|
||||||
<item itemvalue="Cargo Command.Run closures" />
|
<item itemvalue="Cargo Command.Run closures" />
|
||||||
<item itemvalue="Cargo Command.Test lib::tests" />
|
|
||||||
</list>
|
</list>
|
||||||
</recent_temporary>
|
</recent_temporary>
|
||||||
</component>
|
</component>
|
||||||
@ -296,13 +319,16 @@
|
|||||||
<history-entry file="Test_calling_next_directly - 2019.02.01 at 16h 04m 05s.xml">
|
<history-entry file="Test_calling_next_directly - 2019.02.01 at 16h 04m 05s.xml">
|
||||||
<configuration name="Test calling_next_directly" configurationId="CargoCommandRunConfiguration" />
|
<configuration name="Test calling_next_directly" configurationId="CargoCommandRunConfiguration" />
|
||||||
</history-entry>
|
</history-entry>
|
||||||
|
<history-entry file="Test_using_other_iterator_trait_methods - 2019.02.01 at 16h 05m 11s.xml">
|
||||||
|
<configuration name="Test using_other_iterator_trait_methods" configurationId="CargoCommandRunConfiguration" />
|
||||||
|
</history-entry>
|
||||||
</component>
|
</component>
|
||||||
<component name="ToolWindowManager">
|
<component name="ToolWindowManager">
|
||||||
<frame x="1920" y="-438" width="1080" height="1897" extended-state="6" />
|
<frame x="1920" y="-438" width="1080" height="1897" extended-state="6" />
|
||||||
<editor active="true" />
|
<editor active="true" />
|
||||||
<layout>
|
<layout>
|
||||||
<window_info content_ui="combo" id="Project" order="0" sideWeight="0.49642006" visible="true" weight="0.2540132" />
|
<window_info content_ui="combo" id="Project" order="0" sideWeight="0.4968701" visible="true" weight="0.2540132" />
|
||||||
<window_info id="Structure" order="1" sideWeight="0.50358" side_tool="true" visible="true" weight="0.2540132" />
|
<window_info id="Structure" order="1" sideWeight="0.5031299" side_tool="true" visible="true" weight="0.2540132" />
|
||||||
<window_info id="Image Layers" order="2" />
|
<window_info id="Image Layers" order="2" />
|
||||||
<window_info id="Designer" order="3" />
|
<window_info id="Designer" order="3" />
|
||||||
<window_info id="Capture Tool" order="4" />
|
<window_info id="Capture Tool" order="4" />
|
||||||
@ -310,7 +336,7 @@
|
|||||||
<window_info id="Cargo" order="6" sideWeight="0.49791494" weight="0.3286119" />
|
<window_info id="Cargo" order="6" sideWeight="0.49791494" weight="0.3286119" />
|
||||||
<window_info anchor="bottom" id="Message" order="0" />
|
<window_info anchor="bottom" id="Message" order="0" />
|
||||||
<window_info anchor="bottom" id="Find" order="1" weight="0.32979318" />
|
<window_info anchor="bottom" id="Find" order="1" weight="0.32979318" />
|
||||||
<window_info active="true" anchor="bottom" id="Run" order="2" visible="true" weight="0.29737285" />
|
<window_info anchor="bottom" id="Run" order="2" weight="0.29737285" />
|
||||||
<window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
|
<window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
|
||||||
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
|
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
|
||||||
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
|
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
|
||||||
@ -318,7 +344,7 @@
|
|||||||
<window_info anchor="bottom" id="Docker" order="7" show_stripe_button="false" />
|
<window_info anchor="bottom" id="Docker" order="7" show_stripe_button="false" />
|
||||||
<window_info anchor="bottom" id="Version Control" order="8" />
|
<window_info anchor="bottom" id="Version Control" order="8" />
|
||||||
<window_info anchor="bottom" id="Inspection Results" order="9" weight="0.32979318" />
|
<window_info anchor="bottom" id="Inspection Results" order="9" weight="0.32979318" />
|
||||||
<window_info anchor="bottom" id="Terminal" order="10" weight="0.28563443" />
|
<window_info active="true" anchor="bottom" id="Terminal" order="10" visible="true" weight="0.28563443" />
|
||||||
<window_info anchor="bottom" id="Event Log" order="11" side_tool="true" />
|
<window_info anchor="bottom" id="Event Log" order="11" side_tool="true" />
|
||||||
<window_info anchor="right" id="Commander" order="0" weight="0.4" />
|
<window_info anchor="right" id="Commander" order="0" weight="0.4" />
|
||||||
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
|
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
|
||||||
@ -630,8 +656,8 @@
|
|||||||
</entry>
|
</entry>
|
||||||
<entry file="file://$PROJECT_DIR$/closures/src/lib.rs">
|
<entry file="file://$PROJECT_DIR$/closures/src/lib.rs">
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
<state relative-caret-position="1165">
|
<state relative-caret-position="624">
|
||||||
<caret line="74" column="1" selection-start-line="74" selection-start-column="1" selection-end-line="74" selection-end-column="1" />
|
<caret line="39" column="57" selection-start-line="39" selection-start-column="57" selection-end-line="39" selection-end-column="57" />
|
||||||
<folding>
|
<folding>
|
||||||
<element signature="e#437#438#0" expanded="true" />
|
<element signature="e#437#438#0" expanded="true" />
|
||||||
<element signature="e#472#473#0" expanded="true" />
|
<element signature="e#472#473#0" expanded="true" />
|
||||||
@ -639,5 +665,26 @@
|
|||||||
</state>
|
</state>
|
||||||
</provider>
|
</provider>
|
||||||
</entry>
|
</entry>
|
||||||
|
<entry file="file://$PROJECT_DIR$/minigrep_v2/Cargo.toml">
|
||||||
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
|
<state relative-caret-position="112">
|
||||||
|
<caret line="7" selection-start-line="7" selection-end-line="7" />
|
||||||
|
</state>
|
||||||
|
</provider>
|
||||||
|
</entry>
|
||||||
|
<entry file="file://$PROJECT_DIR$/minigrep_v2/src/main.rs">
|
||||||
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
|
<state relative-caret-position="272">
|
||||||
|
<caret line="17" lean-forward="true" selection-start-line="17" selection-end-line="17" />
|
||||||
|
</state>
|
||||||
|
</provider>
|
||||||
|
</entry>
|
||||||
|
<entry file="file://$PROJECT_DIR$/minigrep_v2/src/lib.rs">
|
||||||
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
|
<state relative-caret-position="960">
|
||||||
|
<caret line="60" column="40" selection-start-line="60" selection-start-column="40" selection-end-line="60" selection-end-column="40" />
|
||||||
|
</state>
|
||||||
|
</provider>
|
||||||
|
</entry>
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
7
minigrep_v2/Cargo.toml
Normal file
7
minigrep_v2/Cargo.toml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
[package]
|
||||||
|
name = "minigrep_v2"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Timothy Warren <twarren@nabancard.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
99
minigrep_v2/src/lib.rs
Normal file
99
minigrep_v2/src/lib.rs
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
use std::env;
|
||||||
|
use std::error::Error;
|
||||||
|
use std::fs;
|
||||||
|
|
||||||
|
pub struct Config {
|
||||||
|
pub query: String,
|
||||||
|
pub filename: String,
|
||||||
|
pub case_sensitive: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Config {
|
||||||
|
pub fn new(mut args: std::env::Args) -> Result<Config, &'static str> {
|
||||||
|
args.next(); // Skip the program's name
|
||||||
|
|
||||||
|
let query = match args.next() {
|
||||||
|
Some(arg) => arg,
|
||||||
|
None => return Err("Didn't get a query string"),
|
||||||
|
};
|
||||||
|
|
||||||
|
let filename = match args.next() {
|
||||||
|
Some(arg) => arg,
|
||||||
|
None => return Err("Didn't get a file name"),
|
||||||
|
};
|
||||||
|
|
||||||
|
let case_sensitive = env::var("CASE_INSENSITIVE").is_err();
|
||||||
|
|
||||||
|
Ok(Config { query, filename, case_sensitive })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
|
||||||
|
// The ? operator passes the error back to the caller.
|
||||||
|
let contents = fs::read_to_string(config.filename)?;
|
||||||
|
|
||||||
|
let results = if config.case_sensitive {
|
||||||
|
search(&config.query, &contents)
|
||||||
|
} else {
|
||||||
|
search_case_insensitive(&config.query, &contents)
|
||||||
|
};
|
||||||
|
|
||||||
|
for line in results {
|
||||||
|
println!("{}", line);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
|
||||||
|
contents.lines()
|
||||||
|
.filter(|line| line.contains(query))
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
|
||||||
|
let query = query.to_lowercase();
|
||||||
|
|
||||||
|
contents.lines()
|
||||||
|
.filter(|line| {
|
||||||
|
line.to_lowercase()
|
||||||
|
.as_str()
|
||||||
|
.contains(query.as_str())
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[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)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
17
minigrep_v2/src/main.rs
Normal file
17
minigrep_v2/src/main.rs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
use std::env;
|
||||||
|
use std::process;
|
||||||
|
|
||||||
|
use minigrep_v2;
|
||||||
|
use minigrep_v2::Config;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let config = Config::new(env::args()).unwrap_or_else(|err| {
|
||||||
|
eprintln!("Problem parsing arguments: {}", err);
|
||||||
|
process::exit(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
if let Err(e) = minigrep_v2::run(config) {
|
||||||
|
eprintln!("Application error: {}", e);
|
||||||
|
process::exit(1);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user