# Error Codes ## Error Code Reference Error codes follow a prefixed numbering scheme. The prefix encodes the category and severity. ### General Errors (E0xxx) | Code | Constant | Description | Triggered By | |------|----------|-------------|-------------| | `E0001` | `ErrUnexpectedToken` | Unexpected or unrecognizable character | Tokenizer encounter of non-ASCII, non-operator char | | `E0002` | `ErrUnclosedString` | Unclosed string literal | Missing closing quote at EOF | | `E0003` | `ErrUnclosedComment` | Unclosed block comment | Missing `*/`, `]#`, `#}` etc. at EOF | | `E0004` | `ErrUnclosedBlock` | Unclosed block/control structure | Language-specific: unclosed `if`/`for`/`class`/etc. | | `E0005` | `ErrMismatchedBracket` | Mismatched or unexpected closing bracket | `)` without `(`, `` without `
` | | `E0006` | `ErrUnclosedBracket` | Unclosed bracket at EOF | `validateBrackets()` finds remaining items on bracket stack | | `E0007` | `ErrInvalidSyntax` | General invalid syntax | JSON parse error, TOML missing `=`, YAML empty key | | `E0008` | `ErrUnexpectedEOF` | Unexpected end of file | Reserved for incomplete constructs not covered by other codes | | `E0009` | `ErrEmptySource` | Source is empty (zero-length string) | `validate()` with `source.len == 0` | | `E0010` | `ErrEncodingError` | Encoding error | Reserved for non-UTF-8 input | | `E0011` | -- | File not found | `validateFile()` with non-existent path | ### Language-Specific Errors (E1xxx) | Code | Constant | Description | Languages | |------|----------|-------------|-----------| | `E1001` | `ErrUnexpectedIndent` | Unexpected or inconsistent indentation | Python | | `E1002` | `ErrMissingIndent` | Missing indentation after block opener | Python | | `E1003` | `ErrDuplicateParam` | Duplicate parameter name | (reserved) | | `E1004` | `ErrUndefinedVariable` | Reference to undefined variable | (reserved) | | `E1005` | `ErrTypeMismatch` | Type mismatch | (reserved) | | `E1006` | `ErrInvalidAssignment` | Invalid assignment target | (reserved) | | `E1007` | `ErrMissingReturn` | Function missing return statement | (reserved) | | `E1008` | `ErrInvalidDecorator` | Invalid decorator usage | Python | | `E1009` | `ErrInvalidImport` | Invalid import statement | (reserved) | ### Template Errors (E2xxx) | Code | Constant | Description | Languages | |------|----------|-------------|-----------| | `E2001` | `ErrUnclosedTemplateTag` | Unclosed template expression/block tag | Jinja | | `E2002` | `ErrUnclosedBlockTag` | Unclosed block tag with no matching end tag | Jinja | | `E2003` | `ErrInvalidFilter` | Invalid filter in template expression | Jinja | ### Info Codes (I0xxx) | Code | Constant | Description | |------|----------|-------------| | `I0001` | `InfoLongLine` | Line exceeds recommended length | | `I0002` | `InfoTrailingWhitespace` | Trailing whitespace detected | ### Warning Codes (W0xxx / W1xxx) | Code | Constant | Description | |------|----------|-------------| | `W0001` | `WarnUnusedVariable` | Variable declared but never used | | `W0002` | `WarnInconsistentNaming` | Naming convention inconsistency | | `W0003` | `WarnMissingDoc` | Public symbol missing documentation | | `W1001` | -- | Tab characters in YAML indentation | ### Internal Error | Code | Description | Triggered By | |------|-------------|-------------| | `E9999` | Internal framework error (never-crash fallback) | Any unhandled `Exception` in `validate()` or `validateSource()` | --- ## IO Table: Supported Languages and Per-Language Errors ### Input/Output Contract Every validation function follows the same contract: | Input | Output | |-------|--------| | `source: string` (required) | `ValidationResult` with `valid: bool` | | `flavor: LanguageFlavor = lfUnknown` | `ValidationResult.errors: seq[ValidationError]` | | `options: ValidationOptions` (optional) | `ValidationResult.moduleInfo: ModuleInfo` | | `sourcePath: string = ""` (optional) | `ValidationResult.durationMs: float` | **Guarantees**: - Never throws - all exceptions are caught and returned as `E9999` errors - Empty source returns `E0009` (or `valid: true` for YAML/TOML where empty is valid) - File not found returns `E0011` - Unknown flavor with no detection possible returns an `E0007` error - Every error has a `code`, `message`, `severity`, `position`, and optional `hint` ### Per-Language Tokenizer, Validator, and Error Table #### Nim (`.nim`, `.nims`, `.nimble`) | Aspect | Details | |--------|---------| | Tokenizer | `nim_tokenizer.nim` - `NimTokenizer` | | Validator | `nim_validator.nim` - `NimValidator` | | Keywords | 80+ (addr, and, as, block, break, case, const, converter, defer, discard, elif, else, enum, except, export, finally, for, from, func, if, import, in, include, iterator, let, macro, method, mixin, mod, nil, not, object, of, or, proc, ptr, raise, ref, return, template, try, tuple, type, using, var, when, while, with, yield, etc.) | | Error Code | Condition | Severity | Hint | |------------|-----------|----------|------| | `E0001` | Unexpected character (non-ASCII, unrecognizable) | `esWarning` | Shows hex `U+XXXX` value | | `E0002` | Unclosed string (`"..."` at EOF) | `esError` | "Add a closing quote" | | `E0002` | Unclosed multi-line string (`"""` at EOF) | `esError` | -- | | `E0002` | Newline inside string literal | `esError` | -- | | `E0002` | Unclosed raw string (`r"..."` at EOF) | `esError` | -- | | `E0002` | Unclosed character literal (`'x` at EOF) | `esError` | -- | | `E0003` | Unclosed block comment (`#[` without `]#`) | `esError` | "Add closing `]#`" | | `E0006` | Unclosed bracket (`(`, `[`, `{` at EOF) | `esError` | "Add matching closing bracket" | Structural extraction: imports (`from X import Y`), functions (`proc`, `func`, `method`, `template`, `macro`, `iterator`, `converter`), types (`type Foo`). #### Bash / Shell (`.sh`, `.bash`, `.zsh`, `.fish`) | Aspect | Details | |--------|---------| | Tokenizer | `bash_tokenizer.nim` - `BashTokenizer` | | Validator | `bash_validator.nim` - `BashValidator` | | Keywords | 38+ (if, then, else, elif, fi, case, esac, for, while, until, do, done, in, function, select, time, return, break, continue, exit, declare, local, export, readonly, unset, eval, exec, let, source, shift, trap, type, typeset, ulimit, umask, alias, read, echo) | | Error Code | Condition | Severity | Hint | |------------|-----------|----------|------| | `E0002` | Unclosed single-quoted string | `esError` | -- | | `E0002` | Unclosed double-quoted string | `esError` | -- | | `E0004` | Unclosed `${var}` expansion | `esError` | -- | | `E0004` | Unclosed `$()` command substitution | `esError` | -- | | `E0004` | Unclosed `if` block (`if` without matching `fi`) | `esError` | "Add missing 'fi'" | | `E0004` | Unclosed loop (`for`/`while`/`until` without `done`) | `esError` | "Add missing 'done'" | | `E0004` | Unclosed `case` block (`case` without `esac`) | `esError` | "Add missing 'esac'" | | `E0006` | Unclosed bracket (`(`, `[`, `{` at EOF) | `esError` | -- | Special features: shebang detection (`#!`), heredoc detection (`<`), ESM import/export. Structural extraction: imports/exports, functions (`function`, `async`), classes. #### PHP (`.php`, `.phtml`) | Aspect | Details | |--------|---------| | Tokenizer | `php_tokenizer.nim` - `PHPTokenizer` | | Validator | `php_validator.nim` - `PHPValidator` | | Mode switching | Tracks `inPhpMode` flag - toggles on `` | | Error Code | Condition | Severity | Hint | |------------|-----------|----------|------| | `E0002` | Unclosed string | `esError` | -- | | `E0006` | Unclosed bracket (`(`, `[`, `{` at EOF) | `esError` | -- | Special features: PHP/HTML mode switching, `` detection, variable names (`$var`, `$obj->prop`). Structural extraction: functions (`function`, `fn`), classes (`class`), imports/requires (`include`, `require`, `use`, `namespace`). #### HTML / XML (`.html`, `.htm`, `.xhtml`, `.xml`, `.svg`) | Aspect | Details | |--------|---------| | Tokenizer | `html_tokenizer.nim` - `HTMLTokenizer` | | Validator | `html_validator.nim` - `HTMLValidator` | | Void elements | 14: area, base, br, col, embed, hr, img, input, link, meta, param, source, track, wbr | | Error Code | Condition | Severity | Hint | |------------|-----------|----------|------| | `E0003` | Unclosed HTML comment (``) | `esError` | -- | | `E0004` | Unclosed HTML tag (e.g., `
` without `
`) | `esError` | "Add closing ``" | | `E0005` | Unexpected closing tag (mismatched nesting) | `esWarning` | "Check that tags are properly nested" | Special features: tag stack balancing, void element awareness (no closing tag needed for self-closing elements), attribute parsing with quoted values, ``, `` directives. #### Jinja2 (`.jinja`, `.jinja2`, `.j2`, `.html.j2`) | Aspect | Details | |--------|---------| | Tokenizer | `jinja_tokenizer.nim` - `JinjaTokenizer` | | Validator | `jinja_validator.nim` - `JinjaValidator` | | Error Code | Condition | Severity | Hint | |------------|-----------|----------|------| | `E0003` | Unclosed Jinja comment (`{#` without `#}`) | `esError` | -- | | `E2001` | Unclosed expression tag (`{{` without `}}`) | Implicit via tokenizer | -- | | `E2001` | Unclosed block tag (`{%` without `%}`) | Implicit via tokenizer | -- | | `E2002` | Unclosed `for` block (no matching `endfor`) | `esError` | "Add `{% endfor %}`" | | `E2002` | Unclosed `if` block (no matching `endif`) | `esError` | "Add `{% endif %}`" | | `E2002` | Unclosed `block` (no matching `endblock`) | `esError` | "Add `{% endblock %}`" | | `E2002` | Unclosed `macro`, `filter`, `raw`, `autoescape`, `call`, `with` | `esError` | "Add matching `end{tag}`" | Special features: tracks 12 block tag types (`for`, `if`, `block`, `macro`, `filter`, `raw`, `autoescape`, `call`, `with`), validates matching end tags, handles content between template syntax and plain text. #### JSON (`.json`, `.jsonc`) | Aspect | Details | |--------|---------| | Validator | `config_validators.nim` - `JSONValidator` | | Method | Uses Nim's built-in `parseJson()` for full validation | | Error Code | Condition | Severity | Hint | |------------|-----------|----------|------| | `E0007` | JSON parse error (any `JsonParsingError`) | `esError` | Error message from parser | | `E0007` | Any other exception during parse | `esError` | "JSON error: {message}" | | `E0009` | Empty JSON source | `esError` | -- | #### YAML (`.yaml`, `.yml`) | Aspect | Details | |--------|---------| | Validator | `config_validators.nim` - `YAMLValidator` | | Method | Line-by-line structural analysis | | Error Code | Condition | Severity | Hint | |------------|-----------|----------|------| | `E0007` | Empty mapping key (no key before `:`) | `esError` | -- | | `E0007` | General YAML structural error | `esError` | -- | | `E0009` | No content after stripping comments/blanks | `esError` | -- | | `W1001` | Tab characters used for indentation | `esWarning` | "Use spaces for YAML indentation" | Note: Empty YAML (only whitespace/comments) is `valid: true`. #### TOML (`.toml`) | Aspect | Details | |--------|---------| | Validator | `config_validators.nim` - `TOMLValidator` | | Method | Line-by-line structural analysis | | Error Code | Condition | Severity | Hint | |------------|-----------|----------|------| | `E0007` | Missing `=` in key-value pair | `esError` | "TOML uses `key = value` format" | | `E0007` | Missing key before `=` | `esError` | -- | | `E0007` | General TOML structural error | `esError` | -- | | `E0009` | No content after stripping comments/blanks | `esError` | -- |