use tools/nickel/process.nu [ncl-eval] use primitives/io/interface.nu [_ansi _print] use platform/config/accessor.nu [get-provisioning-resources get-use-nickel] export def clip_copy [msg: string, show: bool] { if ((version).installed_plugins | str contains "clipboard") { $msg | clipboard copy print $"(_ansi default_dimmed)copied into clipboard now (_ansi reset)" } else { if (not $show) { _print $msg } } } export def notify_msg [ title: string body: string icon: string time_body: string timeout: duration task?: closure ] { if ((version).installed_plugins | str contains "desktop_notifications") { if $task != null { (notify -s $title -t $time_body --timeout $timeout -i $icon) } else { (notify -s $title -t $body --timeout $timeout -i $icon) } } else { if $task != null { _print $"(_ansi blue)($title)(_ansi reset)\n(_ansi blue_bold)($time_body)(_ansi reset)" } else { _print $"(_ansi blue)($title)(_ansi reset)\n(_ansi blue_bold)($body)(_ansi reset)" } } } export def show_qr [url: string] { let qr_path = ((get-provisioning-resources) | path join "qrs" | path join ($url | path basename)) if ($qr_path | path exists) { _print (open -r $qr_path) } else { _print $"(_ansi blue_reverse)($url)(_ansi reset)" _print $"(_ansi purple)($url)(_ansi reset)" } } export def port_scan [ip: string, port: int, sec_timeout: int] { (^nc -zv -w $sec_timeout ($ip | str trim) $port err> (if $nu.os-info.name == "windows" { "NUL" } else { "/dev/null" }) | complete).exit_code == 0 } export def render_template [ template_path: string vars: record --ai_prompt: string ] { if ((version).installed_plugins | str contains "tera") { $vars | tera-render $template_path } else { error make {msg: "nu_plugin_tera not available - template rendering not supported"} } } export def render_template_ai [ai_prompt: string, template_type: string = "template"] { use platform/ai/lib.nu * ai_generate_template $ai_prompt $template_type } export def process_decl_file [decl_file: string, format: string] { if (get-use-nickel) { if $format == "json" { let result = (ncl-eval $decl_file []) $result | to json } else { let result = (do {^nickel export $decl_file --format $format} | complete) if $result.exit_code == 0 { $result.stdout } else { error make {msg: $result.stderr} } } } else { error make {msg: "Nickel CLI not available"} } } export def validate_decl_schema [decl_file: string, data: record] { if (get-use-nickel) { let data_json = ($data | to json) let result = (^nickel validate $decl_file --data $data_json | complete) $result.exit_code == 0 } else { false } }