Implementing CCL
Core Requirements
Section titled “Core Requirements”Every CCL implementation needs two operations:
- Parse - Convert text to flat key-value entries
- Build Hierarchy - Convert entries to nested structure via recursive parsing
Everything else is optional library convenience.
Language Patterns
Section titled “Language Patterns”Functional (Gleam, OCaml)
Section titled “Functional (Gleam, OCaml)”pub fn parse(text: String) -> Result(List(Entry), ParseError)pub fn build_hierarchy(entries: List(Entry)) -> Result(CCL, ObjectError)Use Result types, pattern matching, immutable data.
Imperative (Go, Java)
Section titled “Imperative (Go, Java)”func Parse(text string) ([]Entry, error)func BuildHierarchy(entries []Entry) (CCL, error)Use error returns, interfaces, builder patterns.
Dynamic (Python, JavaScript)
Section titled “Dynamic (Python, JavaScript)”def parse(text: str) -> list[Entry]def build_hierarchy(entries: list[Entry]) -> CCLUse exceptions, native collections, optional type hints.
Recursive Parsing Algorithm
Section titled “Recursive Parsing Algorithm”function build_hierarchy(entries): result = {} for (key, value) in entries: if key == "": add_to_list(result, value) else if value_looks_like_ccl(value): nested = parse(value) result[key] = build_hierarchy(nested) # Recurse else: result[key] = value return resultFixed-point termination: Recurse until no more CCL syntax found.
See Parsing Algorithm for details.
Optional Features
Section titled “Optional Features”Type-Safe Access (library convenience):
get_string(ccl, path...): stringget_int(ccl, path...): intEntry Processing (composition utilities):
filter(entries, predicate): entriescompose(entries1, entries2): entriesSee Library Features for details.
Testing
Section titled “Testing”Use CCL Test Suite (375 assertions, 180 tests):
- Core Parsing: Filter tests by
functions: ["parse"] - Object Construction: Filter by
functionscontainingbuild_hierarchy - Typed Access: Filter by
validationstarting withget_ - Optional Features: Filter by
featuresarrays (comments,experimental_dotted_keys, etc.)
See Test Suite Guide for complete filtering examples.
Common Challenges
Section titled “Common Challenges”Infinite Recursion: Fixed-point algorithm terminates naturally
Duplicate Keys: Merge into object or list based on value types
Empty Keys: Treat = value as list item
Unicode/CRLF: Break only on LF; preserve CR, preserve unicode
See Syntax Reference for edge cases.