---@meta
---@class ParserOptions
---@field delimiter string? The field delimiter (default: ",").
---@field hasheader boolean? If true, first non-comment row is treated as headers (default: false).
---@field hascomments boolean? If true, lines starting with '#' are skipped (default: false).
---@class XMLElement
---@field _tag string The XML tag name
---@field _attr {[string]: string}? XML attributes as key-value pairs
---@field _text string? Text content of the element
---@field _children XMLElement[]? Child elements
---@class JSONNode
---@field [string] string | number | boolean | nil | JSONNode | JSONArray JSON object fields
---@alias JSONArray (string | number | boolean | nil | JSONNode)[]
---@class CSVRow
---@field [integer] string Numeric indices for field access
---@field Headers string[]? Header row if hasheader was true
--- Returns the minimum of two numbers
---@param a number First number
---@param b number Second number
---@return number #Minimum value
function min(a, b) end
--- Returns the maximum of two numbers
---@param a number First number
---@param b number Second number
---@return number #Maximum value
function max(a, b) end
--- Rounds a number to n decimal places
---@param x number Number to round
---@param n number? Number of decimal places (default: 0)
---@return number #Rounded number
function round(x, n) end
--- Returns the floor of a number
---@param x number Number to floor
---@return number #Floored number
function floor(x) end
--- Returns the ceiling of a number
---@param x number Number to ceil
---@return number #Ceiled number
function ceil(x) end
--- Converts string to uppercase
---@param s string String to convert
---@return string #Uppercase string
function upper(s) end
--- Converts string to lowercase
---@param s string String to convert
---@return string #Lowercase string
function lower(s) end
--- Formats a string using Lua string.format
---@param s string Format string
---@param ... any Values to format
---@return string #Formatted string
function format(s, ...) end
--- Removes leading and trailing whitespace from string
---@param s string String to trim
---@return string #Trimmed string
function trim(s) end
--- Splits a string by separator
---@param inputstr string String to split
---@param sep string? Separator pattern (default: whitespace)
---@return string[] #Array of string parts
function strsplit(inputstr, sep) end
--- Prints table structure recursively
---@param table {[any]: any} Table to dump
---@param depth number? Current depth (default: 0)
function dump(table, depth) end
--- Validates options against a set of valid option keys.
---@param options ParserOptions? The options table to validate
function areOptionsValid(options) end
--- Parses CSV text into rows and fields using a minimal RFC 4180 state machine.
--- Requirements/assumptions:
--- Input is a single string containing the entire CSV content.
--- Field separators are specified by delimiter option (default: comma).
--- Newlines between rows may be "\n" or "\r\n". "\r\n" is treated as one line break.
--- Fields may be quoted with double quotes (").
--- Inside quoted fields, doubled quotes ("") represent a literal quote character.
--- No backslash escaping is supported (not part of RFC 4180).
--- Newlines inside quoted fields are preserved as part of the field.
--- Leading/trailing spaces are preserved; no trimming is performed.
--- Empty fields and empty rows are preserved.
--- The final row is emitted even if the text does not end with a newline.
--- Lines starting with '#' (after optional leading whitespace) are treated as comments and skipped if hascomments is true.
---@param csv string The CSV text to parse.
---@param options ParserOptions? Options for the parser
---@return CSVRow[] #A table (array) of rows; each row is a table with numeric indices and optionally header-named keys.
function fromCSV(csv, options) end
--- Converts a table of rows back to CSV text format (RFC 4180 compliant).
--- Requirements:
--- Input is a table (array) of rows, where each row is a table (array) of field values.
--- Field values are converted to strings using tostring().
--- Fields are quoted if they contain the delimiter, newlines, or double quotes.
--- Double quotes inside quoted fields are doubled ("").
--- Fields are joined with the specified delimiter; rows are joined with newlines.
--- If includeHeaders is true and rows have a Headers field, headers are included as the first row.
---@param rows CSVRow[] Array of rows, where each row is an array of field values.
---@param options ParserOptions? Options for the parser
---@return string #CSV-formatted text
function toCSV(rows, options) end
--- Converts string to number, returns 0 if invalid
---@param str string String to convert
---@return number #Numeric value or 0
function num(str) end
--- Converts number to string
---@param num number Number to convert
---@return string #String representation
function str(num) end
--- Checks if string is numeric
---@param str string String to check
---@return boolean #True if string is numeric
function is_number(str) end
--- Checks if table is a sequential array (1-indexed with no gaps)
---@param t {[integer]: any} Table to check
---@return boolean #True if table is an array
function isArray(t) end
--- Find all elements with a specific tag name (recursive search)
---@param root XMLElement The root XML element (with _tag, _attr, _children fields)
---@param tagName string The tag name to search for
---@return XMLElement[] #Array of matching elements
function findElements(root, tagName) end
--- Visit all elements recursively and call a function on each
---@param root XMLElement The root XML element
---@param callback fun(element: XMLElement, depth: number, path: string) Function to call with each element
function visitElements(root, callback) end
--- Get numeric value from XML element attribute
---@param element XMLElement XML element with _attr field
---@param attrName string Attribute name
---@return number? #The numeric value or nil if not found/not numeric
function getNumAttr(element, attrName) end
--- Set numeric value to XML element attribute
---@param element XMLElement XML element with _attr field
---@param attrName string Attribute name
---@param value number Numeric value to set
function setNumAttr(element, attrName, value) end
--- Modify numeric attribute by applying a function
---@param element XMLElement XML element
---@param attrName string Attribute name
---@param func fun(currentValue: number): number Function that takes current value and returns new value
---@return boolean #True if modification was made
function modifyNumAttr(element, attrName, func) end
--- Find all elements matching a predicate function
---@param root XMLElement The root XML element
---@param predicate fun(element: XMLElement): boolean Function that takes element and returns true/false
---@return XMLElement[] #Array of matching elements
function filterElements(root, predicate) end
--- Get text content of an element
---@param element XMLElement XML element
---@return string? #The text content or nil
function getText(element) end
--- Set text content of an element
---@param element XMLElement XML element
---@param text string Text content to set
function setText(element, text) end
--- Check if element has an attribute
---@param element XMLElement XML element
---@param attrName string Attribute name
---@return boolean #True if attribute exists
function hasAttr(element, attrName) end
--- Get attribute value as string
---@param element XMLElement XML element
---@param attrName string Attribute name
---@return string? #The attribute value or nil
function getAttr(element, attrName) end
--- Set attribute value
---@param element XMLElement XML element
---@param attrName string Attribute name
---@param value string | number | boolean Value to set (will be converted to string)
function setAttr(element, attrName, value) end
--- Find first element with a specific tag name (searches direct children only)
---@param parent XMLElement The parent XML element
---@param tagName string The tag name to search for
---@return XMLElement? #The first matching element or nil
function findFirstElement(parent, tagName) end
--- Add a child element to a parent
---@param parent XMLElement The parent XML element
---@param child XMLElement The child element to add
function addChild(parent, child) end
--- Remove all children with a specific tag name
---@param parent XMLElement The parent XML element
---@param tagName string The tag name to remove
---@return number #Count of removed children
function removeChildren(parent, tagName) end
--- Get all direct children with a specific tag name
---@param parent XMLElement The parent XML element
---@param tagName string The tag name to search for
---@return XMLElement[] #Array of matching children
function getChildren(parent, tagName) end
--- Count children with a specific tag name
---@param parent XMLElement The parent XML element
---@param tagName string The tag name to count
---@return number #Count of matching children
function countChildren(parent, tagName) end
--- Recursively visit all values in a JSON structure
---@param data JSONNode | JSONArray JSON data (nested tables)
---@param callback fun(value: string | number | boolean | nil | JSONNode | JSONArray, key: string?, parent: JSONNode?): nil Function called with (value, key, parent)
function visitJSON(data, callback) end
--- Find all values in JSON matching a predicate
---@param data JSONNode | JSONArray JSON data
---@param predicate fun(value: string | number | boolean | nil | JSONNode | JSONArray, key: string?, parent: JSONNode?): boolean Function that takes (value, key, parent) and returns true/false
---@return (string | number | boolean | nil | JSONNode | JSONArray)[] #Array of matching values
function findInJSON(data, predicate) end
--- Modify all numeric values in JSON matching a condition
---@param data JSONNode | JSONArray JSON data
---@param predicate fun(value: string | number | boolean | nil | JSONNode | JSONArray, key: string?, parent: JSONNode?): boolean Function that takes (value, key, parent) and returns true/false
---@param modifier fun(currentValue: number): number Function that takes current value and returns new value
function modifyJSONNumbers(data, predicate, modifier) end