162 lines
3.8 KiB
Markdown
162 lines
3.8 KiB
Markdown
|
|
# Nickel Template Library
|
||
|
|
|
||
|
|
Reutilizable template library for generating Nickel configuration schemas from TypeDialog forms.
|
||
|
|
|
||
|
|
## Structure
|
||
|
|
|
||
|
|
### Fields (`fields/`)
|
||
|
|
|
||
|
|
Basic field templates for different data types. Each template generates a single field definition.
|
||
|
|
|
||
|
|
- **string_field.ncl.j2** - String field with optional doc and contract
|
||
|
|
- **number_field.ncl.j2** - Number field with validation
|
||
|
|
- **boolean_field.ncl.j2** - Boolean flag field
|
||
|
|
- **optional_field.ncl.j2** - Optional field wrapper (any type)
|
||
|
|
- **enum_field.ncl.j2** - Enumerated field with predefined options
|
||
|
|
|
||
|
|
### Forms (`forms/`)
|
||
|
|
|
||
|
|
Complete schema templates for specific use cases. Each generates a full configuration structure.
|
||
|
|
|
||
|
|
- **config_schema.ncl.j2** - General application configuration
|
||
|
|
- **service_spec.ncl.j2** - Kubernetes service specification
|
||
|
|
- **deployment.ncl.j2** - Deployment configuration with environment and health checks
|
||
|
|
|
||
|
|
### Macros (`macros/`)
|
||
|
|
|
||
|
|
Reusable macro definitions for common patterns.
|
||
|
|
|
||
|
|
- **contracts.ncl.j2** - Validation contract definitions (NonEmpty, port ranges, etc.)
|
||
|
|
- **validation.ncl.j2** - Predicate macros (length, range, etc.)
|
||
|
|
- **metadata.ncl.j2** - Documentation and type annotation helpers
|
||
|
|
|
||
|
|
## Usage
|
||
|
|
|
||
|
|
### Field Templates
|
||
|
|
|
||
|
|
Use in form templates with Tera include syntax:
|
||
|
|
|
||
|
|
```jinja2
|
||
|
|
{% include "fields/string_field.ncl.j2" with {
|
||
|
|
name: "app_name",
|
||
|
|
doc: "Application name",
|
||
|
|
contract: "std.string.NonEmpty",
|
||
|
|
default: "myapp"
|
||
|
|
} %}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Form Templates
|
||
|
|
|
||
|
|
Render a complete schema:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
typedialog nickel-template forms/config_schema.ncl.j2 form_results.json -o config.ncl
|
||
|
|
```
|
||
|
|
|
||
|
|
### Macro Templates
|
||
|
|
|
||
|
|
Include macros in custom templates:
|
||
|
|
|
||
|
|
```jinja2
|
||
|
|
{% include "macros/contracts.ncl.j2" %}
|
||
|
|
{% include "macros/validation.ncl.j2" %}
|
||
|
|
```
|
||
|
|
|
||
|
|
Then use the defined macros:
|
||
|
|
|
||
|
|
```jinja2
|
||
|
|
{{ non_empty_string("username", "User login name") }}
|
||
|
|
{{ port_number("server_port", "HTTP port") }}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Template Context Variables
|
||
|
|
|
||
|
|
Templates expect the following context from form results:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"name": "field_name",
|
||
|
|
"doc": "field description",
|
||
|
|
"contract": "std.string.NonEmpty",
|
||
|
|
"default": "default_value",
|
||
|
|
"field_type": "String|Number|Bool",
|
||
|
|
"options": ["option1", "option2"],
|
||
|
|
"groups_by_section": { "section_name": [...fields...] }
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Examples
|
||
|
|
|
||
|
|
### Simple Configuration Schema
|
||
|
|
|
||
|
|
Create a form with fields for app name, version, and debug mode:
|
||
|
|
|
||
|
|
```toml
|
||
|
|
[[fields]]
|
||
|
|
name = "app_name"
|
||
|
|
type = "text"
|
||
|
|
prompt = "Application name"
|
||
|
|
required = true
|
||
|
|
|
||
|
|
[[fields]]
|
||
|
|
name = "app_version"
|
||
|
|
type = "text"
|
||
|
|
prompt = "Version"
|
||
|
|
default = "1.0.0"
|
||
|
|
|
||
|
|
[[fields]]
|
||
|
|
name = "debug_mode"
|
||
|
|
type = "confirm"
|
||
|
|
prompt = "Enable debug mode"
|
||
|
|
```
|
||
|
|
|
||
|
|
Render with template:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
typedialog nickel-template forms/config_schema.ncl.j2 results.json -o config.ncl
|
||
|
|
```
|
||
|
|
|
||
|
|
Output:
|
||
|
|
|
||
|
|
```nickel
|
||
|
|
{
|
||
|
|
app = {
|
||
|
|
name | doc "Application name" : String = "myapp",
|
||
|
|
version | doc "Version" : String = "1.0.0",
|
||
|
|
debug_mode | doc "Enable debug mode" : Bool = true,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Service Specification
|
||
|
|
|
||
|
|
Use for Kubernetes or containerized deployments:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
typedialog form forms/service_spec.ncl.j2 \
|
||
|
|
-o service_results.json
|
||
|
|
|
||
|
|
typedialog nickel-template forms/service_spec.ncl.j2 \
|
||
|
|
service_results.json -o service.ncl
|
||
|
|
|
||
|
|
nickel export service.ncl
|
||
|
|
```
|
||
|
|
|
||
|
|
## Extending
|
||
|
|
|
||
|
|
Create new templates following these conventions:
|
||
|
|
|
||
|
|
1. **Single-field templates** → `fields/{type}_field.ncl.j2`
|
||
|
|
2. **Schema templates** → `forms/{purpose}_schema.ncl.j2`
|
||
|
|
3. **Macro libraries** → `macros/{category}.ncl.j2`
|
||
|
|
|
||
|
|
All templates use Jinja2 syntax. Refer to Tera documentation for available filters and functions.
|
||
|
|
|
||
|
|
## Best Practices
|
||
|
|
|
||
|
|
- Use meaningful variable names in templates
|
||
|
|
- Document required context variables with comments
|
||
|
|
- Keep templates DRY by using macros for common patterns
|
||
|
|
- Validate generated Nickel with `nickel typecheck`
|
||
|
|
- Version templates with your forms for consistency
|