summaryrefslogtreecommitdiffstats
path: root/lib/nix-thin-edge-builder/writeSrcMainRs.nix
diff options
context:
space:
mode:
Diffstat (limited to 'lib/nix-thin-edge-builder/writeSrcMainRs.nix')
-rw-r--r--lib/nix-thin-edge-builder/writeSrcMainRs.nix70
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
}
''