postgres_secrets 1.0.0

Secure access to Postgres credentials.
Documentation
use nom::{
    branch::alt,
    bytes::complete::tag,
    character::complete::{line_ending, none_of},
    combinator::opt,
    multi::many0,
    sequence::{preceded, Tuple},
    IResult, Parser,
};

use crate::pgpass::COMMENT;

fn blank_line(s: &str) -> IResult<&str, ()> {
    let (remaining, _) = line_ending.parse(s)?;
    Ok((remaining, ()))
}

fn comment(s: &str) -> IResult<&str, ()> {
    let (remaining, _) = (
        preceded(tag(COMMENT), many0(none_of("\r\n"))),
        opt(line_ending),
    )
        .parse(s)?;
    Ok((remaining, ()))
}

pub fn ignored(s: &str) -> IResult<&str, ()> {
    alt((blank_line, comment)).parse(s)
}

#[cfg(test)]
pub mod test {
    use super::*;
    use nom::Parser;

    #[test]
    fn simple_comment() {
        let s = "# Foo";
        let expected = ("", ());
        assert_eq!(comment.parse(s), Ok(expected));
        assert_eq!(ignored.parse(s), Ok(expected));

        let s = "# Foo\nabc";
        let expected = ("abc", ());
        assert_eq!(comment.parse(s), Ok(expected));
        assert_eq!(ignored.parse(s), Ok(expected));

        let s = "# Foo\r\nabc";
        let expected = ("abc", ());
        assert_eq!(comment.parse(s), Ok(expected));
        assert_eq!(ignored.parse(s), Ok(expected));
    }

    #[test]
    fn simple_blank() {
        let s = "\nabc";
        let expected = ("abc", ());
        assert_eq!(blank_line.parse(s), Ok(expected));
        assert_eq!(ignored.parse(s), Ok(expected));

        let s = "\r\nabc";
        let expected = ("abc", ());
        assert_eq!(blank_line.parse(s), Ok(expected));
        assert_eq!(ignored.parse(s), Ok(expected));
    }
}