orphist 0.3.0

a command-line interface for orphism
use orphism::{Error, Runtime};

#[derive(Debug, Clone, clap::Parser)]
#[remain::sorted]
pub struct Load {
  #[arg(long, value_name = "FILENAME")]
  match_filename: Option<String>,
  #[arg(long)]
  moc3: bool,
  #[arg(long, value_name = "GLOB", default_value = "./assets/**/*.model3.json")]
  pattern: String,
}

impl Load {
  pub fn execute(self) -> anyhow::Result<()> {
    let Self {
      match_filename: only_filename,
      moc3,
      pattern,
    } = self;

    let mut models = Vec::new();

    log::info!("looking for files matching {pattern:?}");

    for model in glob::glob(&pattern)? {
      let model = model?;

      if let (Some(file_name), Some(target)) = (model.file_name(), only_filename.as_ref()) {
        if !file_name.to_string_lossy().eq(target) {
          log::debug!("skipping {file_name:?} because it does not match {target:?}");
          continue;
        }
      }

      log::debug!("found {model:?}");

      if let Some(root) = model.as_path().parent() {
        log::debug!("attempting to load directory {root:?}");
        let runtime = match Runtime::new_from_runtime_path(root.to_owned()) {
          Ok(runtime) => {
            log::info!("loaded model from directory {root:?}");
            runtime
          }
          Err(Error::RuntimePathContainsMultipleModels(_)) => {
            log::debug!("failed because directory contains multiple models, attempting to load single model");
            match Runtime::new_from_model_path(model.clone()) {
              Ok(runtime) => {
                log::info!("loaded model from file: {model:?}");
                runtime
              }
              Err(error) => Err(error)?,
            }
          }
          Err(error) => Err(error)?,
        };
        let model = runtime.load_model()?;
        models.push(model);
      }
    }

    log::info!("successfully loaded {} models", models.len());

    if moc3 {
      log::info!("attempting to parse .moc3 data from all loaded models");

      for model in models {
        let model = orphism::moc3::Model::read(model.data)?;

        println!("{model:#?}");
      }
    }

    Ok(())
  }
}