Jonathan Bernard e3f0fdc1ab Refactor vCard validation and canonicalize VERSION handling
Move whole-card cardinality checks into overloaded validate helpers in
the vCard 3 and vCard 4 modules, and have readVCard invoke those
validators after parsing instead of hard-coding property checks in the
shared parser.

For vCard 3, validate property cardinality directly from propertyCardMap
and add regression coverage for duplicate single-cardinality properties.
For vCard 4, validate from propertyCardMap as well, while preserving
ALTID semantics for single-cardinality properties so alternate
representations remain valid and duplicate ungrouped properties are
rejected.

Rework VERSION handling to treat it as parser metadata rather than
stored card content. Parsing still requires exactly one canonical
VERSION line and rejects missing or duplicate occurrences, but parsed
cards no longer retain VC3_Version or VC4_Version objects in content.
Accessors and serializers continue to expose and emit the canonical
version for the concrete card type, which keeps parsed and
programmatically constructed cards on the same model.

Update the vCard 3 and vCard 4 test suites to cover the new validation
path, confirm VERSION is not persisted in content, and adjust fixture
expectations to match the canonical VERSION model.

AI-Assisted: yes
AI-Tool: OpenAI Codex / gpt-5.4 xhigh
2026-03-28 19:41:09 -05:00
2023-05-03 02:16:18 -05:00
2023-05-03 07:11:32 -05:00

VCard

nim-vcard is a pure nim implementation of the VCard format defined in RFCs 2425, 2426, and 6350. It allows you to parse and serialize VCards, as well as create VCards programmatically. It aims to be a complete implememtation, supporting all of the features of the VCard3 standard. Because the standard provides many features that may be rarely used, this library also provides a simplified API for more typical use-cases.

Example Usage

BEGIN:VCARD
VERSION:3.0
UID: 5db6f100-e2d6-4e8d-951f-d920586bc069
N:Foster;Jack;Allen;;
FN:Allen Foster
REV:20230408T122102Z
EMAIL;TYPE=home;TYPE=pref:allen@fosters.test
EMAIL;TYPE=work:jack.foster@company.test
TEL;TYPE=CELL:+1 (555) 123-4567
END:VCARD

4839ff64a8/examples/simple.nim (L1-L22)

Future Goals

  • VCard 4.0 support

Debugging

Need to clean up and organize

Run tvcard3 tests in gdb:

$ cd tests
$ nim --debuginfo --linedir:on c tvcard3
$ gdb --tui tvcard3
Description
No description provided
Readme 430 KiB
Languages
Nim 99.6%
Makefile 0.4%