use std::path::Path;
use crate::validation::data::{Packages, PackagesError};
#[derive(thiserror::Error, Debug)]
#[allow(missing_docs)]
pub enum ParseError {
#[error(transparent)]
Parse(#[from] anyhow::Error),
#[error(transparent)]
Adding(#[from] PackagesError),
}
pub struct Parser {
parser: protobuf_parse::Parser,
}
impl Parser {
pub fn new(root: &Path) -> Self {
let mut parser = protobuf_parse::Parser::new();
parser.pure();
parser.include(root);
Self { parser }
}
pub fn input(&mut self, file: &Path) {
self.parser.input(file);
}
pub fn parse(self) -> Result<Packages, ParseError> {
let fds = self.parser.file_descriptor_set()?;
let packages = fds
.file
.iter()
.try_fold(Packages::default(), |mut packages, item| {
packages.add(item).map(|_| packages)
})?;
Ok(packages)
}
}