Browse Source

More information in the state

master
Julio Biason 6 years ago
parent
commit
05dbed79ed
  1. 44
      src/main.rs

44
src/main.rs

@ -4,10 +4,36 @@ use std::fs::File;
use std::io::prelude::*; use std::io::prelude::*;
use slug::slugify; use slug::slugify;
enum State { enum CurrentTag {
Title Title
} }
struct State {
tag: Option<CurrentTag>,
title: String
}
impl State {
pub fn new() -> Self {
Self { tag: None, title: String::from("") }
}
pub fn change_title(self, title:&str) -> Self {
Self { tag:self.tag,
title:title.to_string() }
}
pub fn change_tag(self, tag:CurrentTag) -> Self {
Self { tag:Some(tag),
title:self.title }
}
pub fn remove_tag(self) -> Self {
Self { tag:None,
title:self.title }
}
}
fn main() { fn main() {
let args:Vec<_> = env::args().collect(); let args:Vec<_> = env::args().collect();
if args.len() != 2 { if args.len() != 2 {
@ -29,23 +55,23 @@ fn main() {
let mut parser = Parser::new(); let mut parser = Parser::new();
parser.feed_str(&contents); parser.feed_str(&contents);
parser.fold(None, {|state:Option<State>, element| { parser.fold(State::new(), {|state:State, element| {
match element.unwrap() { match element.unwrap() {
Event::ElementStart(tag) => { Event::ElementStart(tag) => {
match tag.name.as_ref() { match tag.name.as_ref() {
"title" => Some(State::Title), "title" => state.change_tag(CurrentTag::Title),
_ => None _ => state
} }
}, },
Event::ElementEnd(_) => { Event::ElementEnd(_) => {
None // ending a tag always remove the state state.remove_tag()
}, },
Event::Characters(data) => { Event::Characters(data) => {
// println!("Data: {}", data); // println!("Data: {}", data);
match state { match state.tag {
Some(State::Title) => { Some(CurrentTag::Title) => {
println!("TITLE: {}", slugify(data)); println!("TITLE: {}", slugify(&data));
None state.change_title(&slugify(data))
}, },
_ => state _ => state
} }

Loading…
Cancel
Save