cargo-pipe 0.1.15

A command-line tool to generate and build data integration app using pipebase framework
use crate::{errors::CmdResult, print::Printer};
use pipegen::models::App;
use pipegen::models::Dependency;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::path::Path;

pub(crate) fn read_pipe_manifest(manifest_path: &Path, printer: &mut Printer) -> CmdResult<App> {
    printer.status(&"Parse", manifest_path.to_str().unwrap())?;
    let app = match App::read_from_path(manifest_path) {
        Ok(app) => app,
        Err(err) => {
            printer.error(err.to_string())?;
            return Err(err.into());
        }
    };
    printer.status(&"Parse", "succeed")?;
    Ok(app)
}

#[derive(Deserialize, Serialize, Debug)]
pub struct PipeTomlProject {
    name: String,
    version: String,
    authors: Option<Vec<String>>,
    edition: Option<String>,
}

#[derive(Deserialize, Serialize, Debug)]
#[serde(rename_all = "kebab-case")]
pub struct PipeTomlDependency {
    version: Option<String>,
    path: Option<String>,
    git: Option<String>,
    branch: Option<String>,
    tag: Option<String>,
    features: Option<Vec<String>>,
    package: Option<String>,
}

impl From<Dependency> for PipeTomlDependency {
    fn from(pd: Dependency) -> Self {
        PipeTomlDependency {
            version: pd.get_version(),
            path: pd.get_path(),
            git: pd.get_git(),
            branch: pd.get_branch(),
            tag: pd.get_tag(),
            features: pd.get_features(),
            package: pd.get_package(),
        }
    }
}

#[derive(Debug, Deserialize, Serialize)]
pub struct PipeTomlWorkspace {}

impl PipeTomlWorkspace {
    pub fn new() -> Self {
        PipeTomlWorkspace {}
    }
}

#[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "kebab-case")]
pub struct PipeTomlManifest {
    package: Option<PipeTomlProject>,
    dependencies: Option<HashMap<String, PipeTomlDependency>>,
    workspace: Option<PipeTomlWorkspace>,
}

impl PipeTomlManifest {
    pub fn init(&mut self) {
        self.dependencies = Some(HashMap::new());
        self.workspace = Some(PipeTomlWorkspace::new());
    }

    pub fn add_dependency(&mut self, name: String, dependency: PipeTomlDependency) {
        let dependencies = self.dependencies.as_mut().unwrap();
        dependencies.insert(name, dependency);
    }
}