css-minify 0.3.1

CSS parser and minificator based on nom
Documentation
use crate::parsers::parameters::parse_parameters;
use crate::parsers::selector::parse_selectors;
use crate::parsers::utils::{non_useless, some_block};
use crate::structure::Block;
use nom::combinator::into;
use nom::sequence::tuple;
use nom::IResult;

pub fn parse_block(input: &str) -> IResult<&str, Block> {
    into(tuple((
        non_useless(parse_selectors),
        some_block(parse_parameters),
    )))(input)
}

#[cfg(test)]
mod test {
    use crate::parsers::block::parse_block;
    use crate::parsers::utils::non_useless;
    use crate::structure::{Block, Selector, SelectorWithPseudoClasses};
    use indexmap::map::IndexMap;

    #[test]
    fn test_block() {
        assert_eq!(
            non_useless(parse_block)(
                r#"
                #some_id, input {
                    padding: 5px 3px; /* Mega comment */
                    color: white;
                }

            "#
            ),
            Ok((
                "",
                Block {
                    selectors: vec![
                        SelectorWithPseudoClasses(Some(Selector::Id("some_id".into())), vec![]),
                        SelectorWithPseudoClasses(Some(Selector::Tag("input".into())), vec![]),
                    ]
                    .into(),
                    parameters: {
                        let mut tmp = IndexMap::new();
                        tmp.insert("padding".into(), "5px 3px".into());
                        tmp.insert("color".into(), "white".into());
                        tmp.into()
                    }
                }
            ))
        )
    }
    #[test]
    fn test_block_empty() {
        assert_eq!(
            non_useless(parse_block)(
                r#"
                #some_id, input {
                    padding: 5px 3px; /* Mega comment */
                    color: white
                }

            "#
            ),
            Ok((
                "",
                Block {
                    selectors: vec![
                        SelectorWithPseudoClasses(Some(Selector::Id("some_id".into())), vec![]),
                        SelectorWithPseudoClasses(Some(Selector::Tag("input".into())), vec![]),
                    ]
                    .into(),
                    parameters: {
                        let mut tmp = IndexMap::new();
                        tmp.insert("padding".into(), "5px 3px".into());
                        tmp.insert("color".into(), "white".into());
                        tmp.into()
                    }
                }
            ))
        )
    }
}