phalus 0.5.0

Private Headless Automated License Uncoupling System — AI-powered clean room software reimplementation
Documentation
pub mod cargo;
pub mod gomod;
pub mod npm;
pub mod pypi;

use crate::ParsedManifest;
use std::path::Path;
use thiserror::Error;

#[derive(Debug, Error)]
pub enum ManifestError {
    #[error("unsupported manifest format: {0}")]
    Unsupported(String),
    #[error("parse error: {0}")]
    Parse(String),
    #[error("I/O error: {0}")]
    Io(#[from] std::io::Error),
}

pub fn parse_manifest(path: &Path) -> Result<ParsedManifest, ManifestError> {
    let content = std::fs::read_to_string(path)?;
    if npm::NpmParser::detect(path) {
        return npm::NpmParser::parse(&content);
    }
    if pypi::PypiParser::detect(path) {
        return pypi::PypiParser::parse(&content);
    }
    if cargo::CargoParser::detect(path) {
        return cargo::CargoParser::parse(&content);
    }
    if gomod::GoModParser::detect(path) {
        return gomod::GoModParser::parse(&content);
    }
    Err(ManifestError::Unsupported(
        path.file_name()
            .map(|n| n.to_string_lossy().to_string())
            .unwrap_or_else(|| "unknown".into()),
    ))
}