diff options
Diffstat (limited to 'lib/nix-thin-edge-builder/writeSrcMainRs.nix')
-rw-r--r-- | lib/nix-thin-edge-builder/writeSrcMainRs.nix | 70 |
1 files changed, 68 insertions, 2 deletions
diff --git a/lib/nix-thin-edge-builder/writeSrcMainRs.nix b/lib/nix-thin-edge-builder/writeSrcMainRs.nix index b95bca48..73493b38 100644 --- a/lib/nix-thin-edge-builder/writeSrcMainRs.nix +++ b/lib/nix-thin-edge-builder/writeSrcMainRs.nix @@ -5,8 +5,74 @@ let in pkgs.writeText "main.rs" '' /// This file was generated by nix +use clap::Parser; +use tracing::debug; +use tracing::info; -fn main() { - println!("HelloWorld"); +use tedge_cli::Registry; +use tedge_lib::measurement::Measurement; +use tedge_lib::notification::Notification; + +#[tokio::main] +#[tracing::instrument] +async fn main() -> miette::Result<()> { + let args = tedge_cli::cli::Cli::parse(); + let _guard = tedge_cli::logging::setup_logging( + args.logging, + args.chrome_logging.as_ref(), + args.tracy_logging, + )?; + info!("Tedge booting..."); + debug!(?args, "Tedge CLI"); + + let registry = tedge_cli::Registry::default(); + info!("Building application"); + + ${ pkgs.lib.concatMapStrings (comp: '' + let registry = { + let kind_name: &'static str = <${comp.pluginBuilderPath} as tedge_api::PluginBuilder<tedge_core::PluginDirectory>>::kind_name(); + info!(%kind_name, "Registering plugin builder"); + let mut registry = registry; + if !registry.plugin_kinds.insert(kind_name.to_string()) { + miette::bail!("Plugin kind '{}' was already registered, cannot register!", kind_name) + } + + let kind_name_str = kind_name.to_string(); + registry.doc_printers.insert(kind_name.to_string(), Box::new(move || { + use std::io::Write; + use miette::IntoDiagnostic; + use pretty::Arena; + + let mut stdout = std::io::stdout(); + if let Some(config_desc) = <${comp.pluginBuilderPath} as tedge_api::PluginBuilder<tedge_core::PluginDirectory>>::kind_configuration() { + let terminal_width = term_size::dimensions().map(|(w, _)| w).unwrap_or(80); + let arena = Arena::new(); + + let rendered_doc = tedge_cli::config::as_terminal_doc(&config_desc, &arena); + + let mut output = String::new(); + rendered_doc.render_fmt(terminal_width, &mut output).into_diagnostic()?; + + writeln!(stdout, " ----- Documentation for plugin '{}'", kind_name_str) + .into_diagnostic()?; + + writeln!(stdout, "{}", output).into_diagnostic()?; + } else { + let msg = format!(" Documentation for plugin '{}' is unavailable", kind_name); + writeln!(stdout, "{}", nu_ansi_term::Color::Red.bold().paint(msg)) + .into_diagnostic()?; + } + Ok(()) + })); + + tedge_cli::Registry { + app_builder: registry.app_builder.with_plugin_builder(${comp.pluginBuilderPath}), + plugin_kinds: registry.plugin_kinds, + doc_printers: registry.doc_printers, + } + }; + '') components } + + tedge_cli::run_app(args, registry).await } '' |