# Recipe Metadata Schema
#
# Extends PostMetadata with recipe/tutorial-specific fields.
# The additional fields map to `specialized = true` content types
# configured in content-kinds.ncl.
#
# Usage — preferred (make_recipe factory):
#
#   let schema = import "site/nickel/content/metadata/recipe_metadata.ncl" in
#   schema.make_recipe {
#     title      = "Async Error Handling in Rust",
#     slug       = "async-error-handling-in-rust",
#     date       = "2024-01-12",
#     category   = "async-programming",
#     difficulty = "intermediate",
#     duration   = "30 min",
#   }

let c    = import "contracts.ncl" in
let post = import "post_metadata.ncl" in
let d    = import "defaults.ncl" in

{
  RecipeMetadata = post.PostMetadata & {
    # --- Recipe-specific ---

    difficulty
      | String
      | c.DifficultyLevel
      | doc "Skill level required: 'beginner', 'intermediate', or 'advanced'"
      | optional,

    duration
      | String
      | c.ReadTimeContract
      | doc "Total estimated time to follow the recipe. E.g. '30 min', '2 hours'."
      | optional,

    prerequisites
      | Array String
      | doc "Concepts, tools, or recipes the reader should know before starting"
      | default = [],

    tools
      | Array String
      | doc "Software, crates, or commands used in this recipe"
      | default = [],
  },

  # Factory function — Layer 1 (defaults) & Layer 2 (overrides) | contract.
  # Not exported to JSON; accessible only via Nickel import.
  make_recipe
    | not_exported
    | doc "Create a validated recipe metadata record. Provide at minimum: title, slug, date, category."
    = fun overrides =>
        d & overrides | RecipeMetadata,
}
