mod data;
mod parse;
mod rules;
pub(crate) mod serde;
mod violation;
pub use violation::*;
use std::path::Path;
use miette::IntoDiagnostic;
use self::parse::*;
use crate::manifest::PackageManifest;
pub struct Validator {
parser: parse::Parser,
manifest: PackageManifest,
}
impl Validator {
pub fn new(root: &Path, manifest: &PackageManifest) -> Self {
Self {
parser: Parser::new(root),
manifest: manifest.clone(),
}
}
pub fn input(&mut self, file: &Path) {
self.parser.input(file);
}
pub fn validate(self) -> miette::Result<Violations> {
let parsed = self.parser.parse().into_diagnostic()?;
let mut rule_set = rules::all(&self.manifest);
Ok(parsed.check(&mut rule_set))
}
}
#[cfg(test)]
mod tests {
#[test]
fn can_parse_books() {
use std::path::Path;
let mut parser = super::Parser::new(Path::new("tests/data/parsing"));
parser.input(std::path::Path::new("tests/data/parsing/books.proto"));
let packages = parser.parse().unwrap();
let expected = include_str!("../tests/data/parsing/books.json");
let expected = serde_json::from_str(expected).unwrap();
similar_asserts::assert_eq!(packages, expected);
}
#[test]
fn can_parse_addressbook() {
use std::path::Path;
let mut parser = super::Parser::new(Path::new("tests/data/parsing"));
parser.input(std::path::Path::new("tests/data/parsing/addressbook.proto"));
let packages = parser.parse().unwrap();
let expected = include_str!("../tests/data/parsing/addressbook.json");
let expected = serde_json::from_str(expected).unwrap();
similar_asserts::assert_eq!(packages, expected);
}
}