1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
use crate::comment::Comment; use crate::fragment::Fragment; #[derive(Debug, PartialEq, Clone)] pub struct Comments { comments: Vec<Comment>, } impl From<Vec<Comment>> for Comments { fn from(comments: Vec<Comment>) -> Self { Comments { comments } } } impl From<Comments> for String { fn from(comments: Comments) -> Self { comments .comments .into_iter() .map(String::from) .collect::<Vec<_>>() .join("\n\n") } } impl From<Vec<Fragment>> for Comments { fn from(ast: Vec<Fragment>) -> Self { ast.iter() .filter_map(|values| { if let Fragment::Comment(comment) = values { Some(comment.clone()) } else { None } }) .collect::<Vec<Comment>>() .into() } } #[cfg(test)] mod tests { use super::Comments; use crate::body::Body; use crate::comment::Comment; use crate::fragment::Fragment; use indoc::indoc; use pretty_assertions::assert_eq; #[test] fn it_can_give_me_it_as_a_string() { let comments = Comments::from(vec![ Comment::from("# Message Body"), Comment::from("# Another Message Body"), ]); assert_eq!( String::from(comments), String::from(indoc!( " # Message Body # Another Message Body" )) ) } #[test] fn it_can_create_itself_from_an_ast() { let comments = Comments::from(vec![ Fragment::Comment(Comment::from("# Message Body")), Fragment::Body(Body::from("Some body content")), Fragment::Comment(Comment::from("# Another Message Body")), ]); assert_eq!( comments, Comments::from(vec![ Comment::from("# Message Body"), Comment::from("# Another Message Body"), ]) ) } }