Validate vCard 4 parameter applicability

This commit is contained in:
2026-03-28 21:39:03 -05:00
parent 15d2b7ecd0
commit 45e530a4ca

View File

@@ -171,6 +171,16 @@ const supportedParams: Table[string, HashSet[VC4_PropertyName]] = [
pnTz, pnGeo, pnTitle, pnRole, pnLogo, pnOrg, pnRelated, pnCategories, pnTz, pnGeo, pnTitle, pnRole, pnLogo, pnOrg, pnRelated, pnCategories,
pnNote, pnSound, pnUrl, pnKey, pnFburl, pnCaladrUri, pnCalUri ].toHashSet), pnNote, pnSound, pnUrl, pnKey, pnFburl, pnCaladrUri, pnCalUri ].toHashSet),
("CALSCALE", @[pnBday, pnAnniversary].toHashSet),
("SORT-AS", @[pnN, pnOrg].toHashSet),
("GEO", @[pnAdr].toHashSet),
("TZ", @[pnAdr].toHashSet),
("LABEL", @[pnAdr].toHashSet),
].toTable ].toTable
const TIMESTAMP_FORMATS = [ const TIMESTAMP_FORMATS = [
@@ -484,6 +494,29 @@ func parsePidValues(param: VC_Param): seq[PidValue]
template validateType(p: VCardParser, params: seq[VC_Param], t: VC4_ValueType) = template validateType(p: VCardParser, params: seq[VC_Param], t: VC4_ValueType) =
p.validateRequiredParameters(params, [("VALUE", $t)]) p.validateRequiredParameters(params, [("VALUE", $t)])
proc validateParamApplicability(
p: VCardParser,
name: string,
params: seq[VC_Param]
) =
let pn = parseEnum[VC4_PropertyName](name, pnUnknown)
if pn == pnUnknown:
return
let valueType = params.getSingleValue("VALUE")
for param in params:
let pname = param.name.toUpper
if pname == "VALUE" or pname == "ALTID":
continue
if supportedParams.contains(pname) and not supportedParams[pname].contains(pn):
p.error("parameter '$1' is not allowed on property '$2'" % [pname, name])
if pname == "CALSCALE" and valueType.isSome and valueType.get == $vtText:
p.error("parameter 'CALSCALE' is not allowed when VALUE=text")
func cmp[T: VC4_Property](x, y: T): int = func cmp[T: VC4_Property](x, y: T): int =
return cmp(x.pref, y.pref) return cmp(x.pref, y.pref)
@@ -1629,6 +1662,7 @@ proc parseContentLines*(p: var VCardParser): seq[VC4_Property] =
p.expect("4.0") p.expect("4.0")
sawVersion = true sawVersion = true
else: else:
p.validateParamApplicability(name, params)
genPropParsers(fixedValueTypeProperties, group, name, params, result, p) genPropParsers(fixedValueTypeProperties, group, name, params, result, p)
p.expect(CRLF) p.expect(CRLF)