ginko 0.0.4

A device-tree source parser and analyzer
Documentation
use clap::Parser;
use ginko::dts::{Analysis, Diagnostic, DiagnosticPrinter};
use ginko::dts::{FileType, Parser as DtsParser};
use std::error::Error;
use std::fs;
use std::process::exit;

#[derive(clap::Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
    file: String,
}

fn main() -> Result<(), Box<dyn Error>> {
    let args = Args::parse();
    let file_name = args.file;
    let content = fs::read_to_string(file_name.clone())?;
    let file_ending = file_name
        .split('.')
        .last()
        .map(FileType::from_file_ending)
        .unwrap_or_default();
    let mut diagnostics: Vec<Diagnostic> = vec![];

    let mut parser = DtsParser::from_text(content.clone());
    match parser.file() {
        Ok(file) => {
            if !parser.diagnostics.is_empty() {
                let printer = DiagnosticPrinter {
                    file_name,
                    code: content.lines().map(|line| line.to_string()).collect(),
                    diagnostics: &parser.diagnostics,
                };
                println!("{}", printer);
                exit(1);
            }
            let mut analysis = Analysis::new(file_ending);
            analysis.analyze_file(&mut diagnostics, &file);
            if !diagnostics.is_empty() {
                let printer = DiagnosticPrinter {
                    file_name,
                    code: content.lines().map(|line| line.to_string()).collect(),
                    diagnostics: &diagnostics,
                };
                println!("{}", printer);
                exit(1);
            }
        }
        Err(err) => {
            let printer = DiagnosticPrinter {
                file_name,
                code: content.lines().map(|line| line.to_string()).collect(),
                diagnostics: &[err],
            };
            println!("{}", printer);
            exit(1);
        }
    }
    println!("OK; No issues found");
    exit(0);
}