use utils * use config/accessor.nu * 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 ] { # Try to use pre-generated QR code files 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 { # Fallback: display URL in reverse video format _print $"(_ansi blue_reverse)($url)(_ansi reset)" _print $"(_ansi purple)($url)(_ansi reset)" } } export def port_scan [ ip: string port: int sec_timeout: int ] { # Use netcat for port scanning - reliable and portable (^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 ] { # Regular template rendering 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 ai/lib.nu * ai_generate_template $ai_prompt $template_type } export def process_decl_file [ decl_file: string format: string ] { # Use external Nickel CLI (nickel export) if (get-use-nickel) { let result = (^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 ] { # Validate using external Nickel CLI 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 } }