# Big Chef A Go-based tool for modifying XML, JSON, and text documents using XPath/JSONPath/Regex expressions and Lua transformations. ## Features - **Multi-Format Processing**: - XML (XPath) - JSON (JSONPath) - Text (Regex) - **Node Value Modification**: Update text values in XML elements, JSON properties or text matches - **Attribute Manipulation**: Modify XML attributes, JSON object keys or regex capture groups - **Conditional Logic**: Apply transformations based on document content - **Complex Operations**: - Mathematical calculations - String manipulations - Date conversions - Structural changes - CSV/TSV parsing with comments and headers - Whole ass Lua environment - **Error Handling**: Comprehensive error detection for: - Invalid XML/JSON - Malformed XPath/JSONPath - Lua syntax errors ## Usage Examples ### 1. Basic field modification ```xml 44.95 chef -xml "//price" "v=v*2" input.xml 89.9 ``` ### 2. Supports glob patterns ```xml chef -xml "//price" "v=v*2" data/**.xml ``` ### 3. Attribute Update ```xml chef -xml "//item/@price" "v=v*2" input.xml ``` ### 3. JSONPath Transformation ```json // Input { "products": [ {"name": "Widget", "price": 19.99}, {"name": "Gadget", "price": 29.99} ] } // Command chef -json "$.products[*].price" "v=v*0.75" input.json // Output { "products": [ {"name": "Widget", "price": 14.99}, {"name": "Gadget", "price": 22.49} ] } ``` ### 4. Regex Text Replacement Regex works slightly differently, up to 12 match groups are provided as v1..v12 and s1..s12 for numbers and strings respectively. A special shorthand "!num" is also provided that simply expands to `(\d*\.?\d+)`. ```xml Price: $15.00 Special Offer chef "Price: $!num Special Offer" "v1 = v1 * 0.92" input.xml Price: $13.80 Special Offer ``` ### 5. Conditional Transformation ```xml chef -xml "//item" "if tonumber(v.stock) > 0 then v.price = v.price * 0.8 end" input.xml ``` ### 6. CSV/TSV Processing The Lua environment includes CSV parsing functions that support comments, headers, and custom delimiters. ```lua -- Basic CSV parsing local rows = fromCSV(csvText) -- With options local rows = fromCSV(csvText, { delimiter = "\t", -- Tab delimiter for TSV (default: ",") hasHeaders = true, -- First row is headers (default: false) hasComments = true -- Filter lines starting with # (default: false) }) -- Access by index local value = rows[1][2] -- Access by header name (when hasHeaders = true) local value = rows[1].Name -- Convert back to CSV local csv = toCSV(rows, "\t") -- Optional delimiter parameter ``` **Example with commented TSV file:** ```lua -- Input file: -- #mercenary_profiles -- Id Name Value -- 1 Test 100 -- 2 Test2 200 local csv = readFile("mercenaries.tsv") local rows = fromCSV(csv, { delimiter = "\t", hasHeaders = true, hasComments = true }) -- Access data rows[1].Name -- "Test" rows[2].Value -- "200" ``` ## Lua Helper Functions The Lua environment includes many helper functions: ### Math Functions - `min(a, b)`, `max(a, b)` - Min/max of two numbers - `round(x, n)` - Round to n decimal places - `floor(x)`, `ceil(x)` - Floor/ceiling functions ### String Functions - `upper(s)`, `lower(s)` - Case conversion - `trim(s)` - Remove leading/trailing whitespace - `format(s, ...)` - String formatting - `strsplit(inputstr, sep)` - Split string by separator ### CSV Functions - `fromCSV(csv, options)` - Parse CSV/TSV text into table of rows - Options: `delimiter` (default: ","), `hasHeaders` (default: false), `hasComments` (default: false) - `toCSV(rows, delimiter)` - Convert table of rows back to CSV text ### Conversion Functions - `num(str)` - Convert string to number (returns 0 if invalid) - `str(num)` - Convert number to string - `is_number(str)` - Check if string is numeric ### Table Functions - `isArray(t)` - Check if table is a sequential array - `dump(table, depth)` - Print table structure recursively ### HTTP Functions - `fetch(url, options)` - Make HTTP request, returns response table - Options: `method`, `headers`, `body` - Returns: `{status, statusText, ok, body, headers}` ### Regex Functions - `re(pattern, input)` - Apply regex pattern, returns table with matches ## Installation ```bash go build -o chef main.go ``` ```bash # Process XML file ./chef -xml "//price" "v=v*1.2" input.xml # Process JSON file ./chef -json "$.prices[*]" "v=v*0.9" input.json ```