280 lines
9.9 KiB
Plaintext
280 lines
9.9 KiB
Plaintext
|
|
# ╔══════════════════════════════════════════════════════════════════════╗
|
||
|
|
# ║ Nickel Schema → TypeDialog Form Recipes ║
|
||
|
|
# ║ Generate TOML forms with fragments, conditionals, i18n ║
|
||
|
|
# ╚══════════════════════════════════════════════════════════════════════╝
|
||
|
|
|
||
|
|
# Generate TOML form from Nickel schema with all features
|
||
|
|
[doc("Generate TOML form from Nickel schema")]
|
||
|
|
nickel-to-form SCHEMA OUTPUT_DIR="generated":
|
||
|
|
#!/usr/bin/env bash
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
if [ ! -f "{{ SCHEMA }}" ]; then
|
||
|
|
echo "Error: Schema file not found: {{ SCHEMA }}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "Generating TOML form from {{ SCHEMA }}..."
|
||
|
|
mkdir -p "{{ OUTPUT_DIR }}/fragments"
|
||
|
|
mkdir -p "{{ OUTPUT_DIR }}/locales/en"
|
||
|
|
mkdir -p "{{ OUTPUT_DIR }}/locales/es"
|
||
|
|
|
||
|
|
# Generate main form with fragments, conditionals, i18n
|
||
|
|
cargo run --package typedialog -- \
|
||
|
|
nickel-to-form "{{ SCHEMA }}" \
|
||
|
|
--flatten \
|
||
|
|
--groups \
|
||
|
|
--fragments \
|
||
|
|
--conditionals \
|
||
|
|
--i18n \
|
||
|
|
--output "{{ OUTPUT_DIR }}"
|
||
|
|
|
||
|
|
echo "✓ Form generated in {{ OUTPUT_DIR }}/"
|
||
|
|
echo ""
|
||
|
|
echo "Generated files:"
|
||
|
|
[ -f "{{ OUTPUT_DIR }}/form.toml" ] && echo " - {{ OUTPUT_DIR }}/form.toml"
|
||
|
|
[ -f "{{ OUTPUT_DIR }}/main_form.toml" ] && echo " - {{ OUTPUT_DIR }}/main_form.toml"
|
||
|
|
[ -d "{{ OUTPUT_DIR }}/fragments" ] && [ "$(ls -A {{ OUTPUT_DIR }}/fragments 2>/dev/null)" ] && \
|
||
|
|
echo " - {{ OUTPUT_DIR }}/fragments/ ($(ls {{ OUTPUT_DIR }}/fragments/*.toml 2>/dev/null | wc -l) files)"
|
||
|
|
[ -d "{{ OUTPUT_DIR }}/locales" ] && [ "$(ls -A {{ OUTPUT_DIR }}/locales 2>/dev/null)" ] && \
|
||
|
|
echo " - {{ OUTPUT_DIR }}/locales/ ($(ls -d {{ OUTPUT_DIR }}/locales/* 2>/dev/null | wc -l) locales)"
|
||
|
|
|
||
|
|
# Complete workflow: schema → form → execute → Nickel output
|
||
|
|
[doc("Full workflow: schema → form → results → Nickel")]
|
||
|
|
nickel-workflow SCHEMA TEMPLATE OUTPUT="config.ncl":
|
||
|
|
#!/usr/bin/env bash
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
if [ ! -f "{{ SCHEMA }}" ]; then
|
||
|
|
echo "Error: Schema file not found: {{ SCHEMA }}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [ ! -f "{{ TEMPLATE }}" ]; then
|
||
|
|
echo "Error: Template file not found: {{ TEMPLATE }}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
TMP_DIR=$(mktemp -d)
|
||
|
|
trap "rm -rf $TMP_DIR" EXIT
|
||
|
|
|
||
|
|
TMP_FORM="$TMP_DIR/form.toml"
|
||
|
|
TMP_RESULTS="$TMP_DIR/results.json"
|
||
|
|
|
||
|
|
echo "=== Nickel Workflow ==="
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Step 1: Generate form from schema
|
||
|
|
echo "1. Generating TOML form from schema..."
|
||
|
|
just nickel::nickel-to-form "{{ SCHEMA }}" "$TMP_DIR" > /dev/null
|
||
|
|
|
||
|
|
# Step 2: Execute form interactively
|
||
|
|
echo "2. Executing interactive form..."
|
||
|
|
[ -f "$TMP_DIR/main_form.toml" ] && FORM_FILE="$TMP_DIR/main_form.toml" || FORM_FILE="$TMP_DIR/form.toml"
|
||
|
|
|
||
|
|
cargo run --package typedialog -- \
|
||
|
|
form "$FORM_FILE" \
|
||
|
|
-o "$TMP_RESULTS" || {
|
||
|
|
echo "Error: Form execution failed"
|
||
|
|
exit 1
|
||
|
|
}
|
||
|
|
|
||
|
|
# Step 3: Render template
|
||
|
|
echo "3. Rendering Nickel output from template..."
|
||
|
|
cargo run --package typedialog -- \
|
||
|
|
nickel-template "{{ TEMPLATE }}" "$TMP_RESULTS" \
|
||
|
|
-o "{{ OUTPUT }}" || {
|
||
|
|
echo "Error: Template rendering failed"
|
||
|
|
exit 1
|
||
|
|
}
|
||
|
|
|
||
|
|
# Step 4: Validate output
|
||
|
|
echo "4. Validating Nickel configuration..."
|
||
|
|
nickel typecheck "{{ OUTPUT }}" || {
|
||
|
|
echo "Error: Generated Nickel is invalid"
|
||
|
|
exit 1
|
||
|
|
}
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
echo "✓ Workflow complete!"
|
||
|
|
echo " - Nickel configuration written to {{ OUTPUT }}"
|
||
|
|
echo ""
|
||
|
|
echo "Next steps:"
|
||
|
|
echo " - Review: cat {{ OUTPUT }}"
|
||
|
|
echo " - Export: nickel export {{ OUTPUT }}"
|
||
|
|
|
||
|
|
# Preview form generation without writing files
|
||
|
|
[doc("Preview TOML form without writing")]
|
||
|
|
nickel-preview SCHEMA:
|
||
|
|
#!/usr/bin/env bash
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
if [ ! -f "{{ SCHEMA }}" ]; then
|
||
|
|
echo "Error: Schema file not found: {{ SCHEMA }}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "Previewing form generation for {{ SCHEMA }}..."
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
cargo run --package typedialog -- \
|
||
|
|
nickel-to-form "{{ SCHEMA }}" \
|
||
|
|
--flatten \
|
||
|
|
--groups
|
||
|
|
|
||
|
|
# Extract i18n translations only
|
||
|
|
[doc("Extract i18n from Nickel schema")]
|
||
|
|
nickel-i18n SCHEMA OUTPUT_DIR="locales":
|
||
|
|
#!/usr/bin/env bash
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
if [ ! -f "{{ SCHEMA }}" ]; then
|
||
|
|
echo "Error: Schema file not found: {{ SCHEMA }}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "Extracting i18n translations from {{ SCHEMA }}..."
|
||
|
|
mkdir -p "{{ OUTPUT_DIR }}"
|
||
|
|
|
||
|
|
cargo run --package typedialog -- \
|
||
|
|
nickel-to-form "{{ SCHEMA }}" \
|
||
|
|
--i18n \
|
||
|
|
--output "{{ OUTPUT_DIR }}"
|
||
|
|
|
||
|
|
echo "✓ Translations extracted to {{ OUTPUT_DIR }}/"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
if [ -d "{{ OUTPUT_DIR }}/locales" ]; then
|
||
|
|
echo "Generated .ftl files:"
|
||
|
|
find "{{ OUTPUT_DIR }}/locales" -name "*.ftl" -type f | sort | while read f; do
|
||
|
|
locale=$(basename $(dirname "$f"))
|
||
|
|
echo " - $locale: $f ($(wc -l < "$f") lines)"
|
||
|
|
done
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Roundtrip workflow: .ncl → form → .ncl with preserved validators
|
||
|
|
[doc("Roundtrip: input.ncl → form → output.ncl (preserves validators)")]
|
||
|
|
nickel-roundtrip INPUT FORM OUTPUT="output.ncl" VALIDATE="true" VERBOSE="false":
|
||
|
|
#!/usr/bin/env bash
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
if [ ! -f "{{ INPUT }}" ]; then
|
||
|
|
echo "Error: Input Nickel file not found: {{ INPUT }}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [ ! -f "{{ FORM }}" ]; then
|
||
|
|
echo "Error: Form definition not found: {{ FORM }}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
VALIDATE_FLAG=""
|
||
|
|
if [ "{{ VALIDATE }}" != "true" ]; then
|
||
|
|
VALIDATE_FLAG="--no-validate"
|
||
|
|
fi
|
||
|
|
|
||
|
|
VERBOSE_FLAG=""
|
||
|
|
if [ "{{ VERBOSE }}" = "true" ]; then
|
||
|
|
VERBOSE_FLAG="-v"
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "=== Nickel Roundtrip Workflow ==="
|
||
|
|
echo "Input: {{ INPUT }}"
|
||
|
|
echo "Form: {{ FORM }}"
|
||
|
|
echo "Output: {{ OUTPUT }}"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
cargo run --package typedialog -- \
|
||
|
|
nickel-roundtrip \
|
||
|
|
"{{ INPUT }}" \
|
||
|
|
"{{ FORM }}" \
|
||
|
|
--output "{{ OUTPUT }}" \
|
||
|
|
$VALIDATE_FLAG \
|
||
|
|
$VERBOSE_FLAG
|
||
|
|
|
||
|
|
# Roundtrip with pre-executed form results (fast iteration)
|
||
|
|
[doc("Roundtrip from pre-computed form results")]
|
||
|
|
nickel-roundtrip-from-json INPUT RESULTS OUTPUT="output.ncl":
|
||
|
|
#!/usr/bin/env bash
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
if [ ! -f "{{ INPUT }}" ]; then
|
||
|
|
echo "Error: Input Nickel file not found: {{ INPUT }}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [ ! -f "{{ RESULTS }}" ]; then
|
||
|
|
echo "Error: Results JSON file not found: {{ RESULTS }}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "Rendering Nickel from JSON results..."
|
||
|
|
echo "Input: {{ INPUT }}"
|
||
|
|
echo "Results: {{ RESULTS }}"
|
||
|
|
echo "Output: {{ OUTPUT }}"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Extract contracts from input and render with results
|
||
|
|
# (This is a placeholder - would need a dedicated command in CLI)
|
||
|
|
echo "Note: This requires implementation of nickel-render-json command"
|
||
|
|
exit 1
|
||
|
|
|
||
|
|
# Show nickel recipes help
|
||
|
|
[doc("Show Nickel integration recipes help")]
|
||
|
|
help:
|
||
|
|
@echo "╔═══════════════════════════════════════════════════════════╗"
|
||
|
|
@echo "║ Nickel Integration Recipes ║"
|
||
|
|
@echo "║ (For Nickel schema → TOML form generation) ║"
|
||
|
|
@echo "╚═══════════════════════════════════════════════════════════╝"
|
||
|
|
@echo ""
|
||
|
|
@echo "RECIPES:"
|
||
|
|
@echo ""
|
||
|
|
@echo " just nickel::nickel-to-form SCHEMA [OUTPUT_DIR]"
|
||
|
|
@echo " Generate TOML form from Nickel schema with fragments,"
|
||
|
|
@echo " conditionals, and i18n extraction."
|
||
|
|
@echo " Default OUTPUT_DIR: generated/"
|
||
|
|
@echo ""
|
||
|
|
@echo " just nickel::nickel-workflow SCHEMA TEMPLATE [OUTPUT]"
|
||
|
|
@echo " Complete workflow: schema → form → results → Nickel"
|
||
|
|
@echo " Validates output with 'nickel typecheck'."
|
||
|
|
@echo " Default OUTPUT: config.ncl"
|
||
|
|
@echo ""
|
||
|
|
@echo " just nickel::nickel-preview SCHEMA"
|
||
|
|
@echo " Preview form generation without writing files."
|
||
|
|
@echo " Useful for schema validation before full generation."
|
||
|
|
@echo ""
|
||
|
|
@echo " just nickel::nickel-i18n SCHEMA [OUTPUT_DIR]"
|
||
|
|
@echo " Extract and generate i18n (.ftl) files only."
|
||
|
|
@echo " Default OUTPUT_DIR: locales/"
|
||
|
|
@echo ""
|
||
|
|
@echo " just nickel::nickel-roundtrip INPUT FORM [OUTPUT] [VALIDATE] [VERBOSE]"
|
||
|
|
@echo " Roundtrip workflow with validator preservation:"
|
||
|
|
@echo " input.ncl → form execution → output.ncl"
|
||
|
|
@echo " Preserves validator imports and contract calls."
|
||
|
|
@echo " Default OUTPUT: output.ncl, VALIDATE: true, VERBOSE: false"
|
||
|
|
@echo ""
|
||
|
|
@echo "EXAMPLES:"
|
||
|
|
@echo ""
|
||
|
|
@echo " 1. Basic form generation:"
|
||
|
|
@echo " just nickel::nickel-to-form schema.ncl my_form/"
|
||
|
|
@echo ""
|
||
|
|
@echo " 2. Preview before generating:"
|
||
|
|
@echo " just nickel::nickel-preview examples/07-nickel-generation/schemas/simple.ncl"
|
||
|
|
@echo ""
|
||
|
|
@echo " 3. Extract i18n only:"
|
||
|
|
@echo " just nickel::nickel-i18n schema.ncl translations/"
|
||
|
|
@echo ""
|
||
|
|
@echo " 4. Full workflow with template:"
|
||
|
|
@echo " just nickel::nickel-workflow \\"
|
||
|
|
@echo " examples/07-nickel-generation/schemas/simple.ncl \\"
|
||
|
|
@echo " examples/07-nickel-generation/templates/config.ncl.j2 \\"
|
||
|
|
@echo " output_config.ncl"
|
||
|
|
@echo ""
|
||
|
|
@echo " 5. Roundtrip with validator preservation:"
|
||
|
|
@echo " just nickel::nickel-roundtrip \\"
|
||
|
|
@echo " provisioning/values/example.ncl \\"
|
||
|
|
@echo " provisioning/environment-form.toml \\"
|
||
|
|
@echo " -o output_config.ncl \\"
|
||
|
|
@echo " true true"
|
||
|
|
@echo ""
|