#!/usr/bin/env nu # Configuration let template_dir = ".typst-template" let config_dir = ".config" let out_dir = "." def main [subject: string, shortcode: string, number: string = ""] { let subject_lower = ($subject | str downcase) let shortcode_lower = ($shortcode | str downcase) validate-input $subject $shortcode $number let temp_dir = (mktemp -d) let final_dir = $"($out_dir)/($subject_lower)/($shortcode_lower)($number)" let subject_dir = $"($out_dir)/($subject_lower)" copy-template $temp_dir generate-doc-toml $shortcode_lower $subject_lower $temp_dir $number if ($final_dir | path exists) { error make -u {msg: $"Directory ($final_dir) already exists"} } mkdir $subject_dir cp -r $temp_dir $final_dir print $"=> Created new work: ($final_dir)" rm -rf $temp_dir } def validate-input [subject: string, shortcode: string, number: string] { if not ($config_dir | path exists) { error make -u {msg: "Config directory not found"} } let defaults_toml = $"($config_dir)/defaults.toml" let subjects_toml = $"($config_dir)/subjects.toml" if not ($defaults_toml | path exists) { error make -u {msg: $"defaults.toml not found in config directory"} } if not ($subjects_toml | path exists) { error make -u {msg: "subjects.toml not found in config directory"} } if $out_dir != "." and not ($out_dir | path exists) { mkdir $out_dir } # Check subject exists (case insensitive) let subject_lower = ($subject | str downcase) let subjects = (open $subjects_toml | get subjects | columns) if $subject_lower not-in $subjects { error make -u { msg: $"Subject '($subject)' not found in configuration" help: $"Available subjects: ($subjects | str join ', ')" } } } def copy-template [target_dir: string] { if not ($template_dir | path exists) { error make -u {msg: $"Template directory ($template_dir) not found"} } cd $template_dir cp -r * $target_dir } def generate-doc-toml [shortcode: string, subject: string, target_dir: string, number: string] { let defaults = (open $"($config_dir)/defaults.toml") let subjects = (open $"($config_dir)/subjects.toml") let subject_data = ($subjects | get subjects | get $subject) let work_type = ($defaults | get work_types | try { get $shortcode } catch { $shortcode }) let number = if $number != "" { $number | into int } else { "" } { university: ($defaults | get university) subject: ($subject_data | get name) type: $work_type number: $number mentors: ($subject_data | get mentors) authors: [($defaults | get default_author)] } | compact --empty | to toml | save $"($target_dir)/src/doc.toml" --force }