{"version":3,"file":"tag-values.mjs","names":[],"sources":["../../../src/message/parser/tag-values.ts"],"sourcesContent":["import type { TwitchBadgesList } from \"../badges\";\nimport type { Color } from \"../color\";\nimport type { TwitchEmoteList } from \"../emotes\";\nimport type { TwitchFlagList } from \"../flags\";\nimport type { IRCMessageTags } from \"../irc/tags\";\nimport { parseBadges } from \"./badges\";\nimport { parseColor } from \"./color\";\nimport { type TwitchEmoteSets, parseEmoteSets } from \"./emote-sets\";\nimport { parseEmotes } from \"./emotes\";\nimport { parseFlags } from \"./flags\";\nimport { MissingTagError } from \"./missing-tag-error\";\nimport { ParseError } from \"./parse-error\";\n\nexport function requireData<V, A extends unknown[]>(\n  ircTags: IRCMessageTags,\n  key: string,\n  converter: (value: string, ...converterArguments: A) => V | undefined,\n  ...converterArguments: A\n): V {\n  const stringValue = ircTags[key];\n  if (stringValue == null) {\n    throw new MissingTagError(key, stringValue);\n  }\n\n  const value = converter(stringValue, ...converterArguments);\n  if (value == null) {\n    throw new MissingTagError(key, stringValue);\n  }\n  return value;\n}\n\nexport function getData<V, A extends unknown[]>(\n  ircTags: IRCMessageTags,\n  key: string,\n  converter: (value: string, ...converterArguments: A) => V,\n  ...converterArguments: A\n): V | undefined {\n  const stringValue = ircTags[key];\n  if (stringValue == null) {\n    return undefined;\n  }\n  return converter(stringValue, ...converterArguments);\n}\n\nexport function convertToString(value: string): string {\n  return value;\n}\n\nexport function convertToTrimmedString(value: string): string {\n  if (typeof value === \"string\") {\n    return value.trim();\n  }\n  return value;\n}\n\nexport function convertToInt(value: string): number {\n  const parsedInt = Number.parseInt(value);\n  if (Number.isNaN(parsedInt)) {\n    throw new ParseError(`Failed to parse integer from tag value \"${value}\"`);\n  }\n  return parsedInt;\n}\n\nexport function convertToBoolean(value: string): boolean {\n  return Boolean(convertToInt(value));\n}\n\nexport function convertToColor(value: string): Color | undefined {\n  if (value.length <= 0) {\n    return undefined;\n  }\n  return parseColor(value);\n}\n\nexport function convertToTimestamp(value: string): Date {\n  return new Date(convertToInt(value));\n}\n\nexport function convertToBadges(value: string): TwitchBadgesList {\n  return parseBadges(value);\n}\n\nexport function convertToEmotes(\n  value: string,\n  messageText: string,\n): TwitchEmoteList {\n  return parseEmotes(messageText, value);\n}\n\nexport function convertToEmoteSets(value: string): TwitchEmoteSets {\n  return parseEmoteSets(value);\n}\n\nexport function convertToFlags(\n  value: string,\n  messageText: string,\n): TwitchFlagList {\n  return parseFlags(messageText, value);\n}\n\nexport interface TagValueParser {\n  getString: (key: string) => string | undefined;\n  // getTrimmedString: Used for sanitizing display-names. See https://github.com/robotty/dank-twitch-irc/issues/33\n  getTrimmedString: (key: string) => string | undefined;\n  requireString: (key: string) => string;\n  getInt: (key: string) => number | undefined;\n  requireInt: (key: string) => number;\n  getBoolean: (key: string) => boolean | undefined;\n  requireBoolean: (key: string) => boolean;\n  getColor: (key: string) => Color | undefined;\n  requireColor: (key: string) => Color;\n  getTimestamp: (key: string) => Date | undefined;\n  requireTimestamp: (key: string) => Date;\n  getBadges: (key: string) => TwitchBadgesList | undefined;\n  requireBadges: (key: string) => TwitchBadgesList;\n  getEmotes: (key: string, messageText: string) => TwitchEmoteList | undefined;\n  requireEmotes: (key: string, messageText: string) => TwitchEmoteList;\n  getEmoteSets: (key: string) => TwitchEmoteSets | undefined;\n  requireEmoteSets: (key: string) => TwitchEmoteSets;\n  getFlags: (key: string, messageText: string) => TwitchFlagList | undefined;\n}\n\nexport function tagParserFor(ircTags: IRCMessageTags): TagValueParser {\n  return {\n    getString: (key: string) => getData(ircTags, key, convertToString),\n    getTrimmedString: (key: string) =>\n      getData(ircTags, key, convertToTrimmedString),\n    requireString: (key: string) => requireData(ircTags, key, convertToString),\n    getInt: (key: string) => getData(ircTags, key, convertToInt),\n    requireInt: (key: string) => requireData(ircTags, key, convertToInt),\n    getBoolean: (key: string) => getData(ircTags, key, convertToBoolean),\n    requireBoolean: (key: string) =>\n      requireData(ircTags, key, convertToBoolean),\n    getColor: (key: string) => getData(ircTags, key, convertToColor),\n    requireColor: (key: string) => requireData(ircTags, key, convertToColor),\n    getTimestamp: (key: string) => getData(ircTags, key, convertToTimestamp),\n    requireTimestamp: (key: string) =>\n      requireData(ircTags, key, convertToTimestamp),\n    getBadges: (key: string) => getData(ircTags, key, convertToBadges),\n    requireBadges: (key: string) => requireData(ircTags, key, convertToBadges),\n    getEmotes: (key: string, messageText: string) =>\n      getData(ircTags, key, convertToEmotes, messageText),\n    requireEmotes: (key: string, messageText: string) =>\n      requireData(ircTags, key, convertToEmotes, messageText),\n    getEmoteSets: (key: string) => getData(ircTags, key, convertToEmoteSets),\n    requireEmoteSets: (key: string) =>\n      requireData(ircTags, key, convertToEmoteSets),\n    getFlags: (key: string, messageText: string) =>\n      getData(ircTags, key, convertToFlags, messageText),\n  };\n}\n"],"mappings":";;;;;;;;AAaA,SAAgB,YACd,SACA,KACA,WACA,GAAG,oBACA;CACH,MAAM,cAAc,QAAQ;AAC5B,KAAI,eAAe,KACjB,OAAM,IAAI,gBAAgB,KAAK,YAAY;CAG7C,MAAM,QAAQ,UAAU,aAAa,GAAG,mBAAmB;AAC3D,KAAI,SAAS,KACX,OAAM,IAAI,gBAAgB,KAAK,YAAY;AAE7C,QAAO;;AAGT,SAAgB,QACd,SACA,KACA,WACA,GAAG,oBACY;CACf,MAAM,cAAc,QAAQ;AAC5B,KAAI,eAAe,KACjB;AAEF,QAAO,UAAU,aAAa,GAAG,mBAAmB;;AAGtD,SAAgB,gBAAgB,OAAuB;AACrD,QAAO;;AAGT,SAAgB,uBAAuB,OAAuB;AAC5D,KAAI,OAAO,UAAU,SACnB,QAAO,MAAM,MAAM;AAErB,QAAO;;AAGT,SAAgB,aAAa,OAAuB;CAClD,MAAM,YAAY,OAAO,SAAS,MAAM;AACxC,KAAI,OAAO,MAAM,UAAU,CACzB,OAAM,IAAI,WAAW,2CAA2C,MAAM,GAAG;AAE3E,QAAO;;AAGT,SAAgB,iBAAiB,OAAwB;AACvD,QAAO,QAAQ,aAAa,MAAM,CAAC;;AAGrC,SAAgB,eAAe,OAAkC;AAC/D,KAAI,MAAM,UAAU,EAClB;AAEF,QAAO,WAAW,MAAM;;AAG1B,SAAgB,mBAAmB,OAAqB;AACtD,QAAO,IAAI,KAAK,aAAa,MAAM,CAAC;;AAGtC,SAAgB,gBAAgB,OAAiC;AAC/D,QAAO,YAAY,MAAM;;AAG3B,SAAgB,gBACd,OACA,aACiB;AACjB,QAAO,YAAY,aAAa,MAAM;;AAGxC,SAAgB,mBAAmB,OAAgC;AACjE,QAAO,eAAe,MAAM;;AAG9B,SAAgB,eACd,OACA,aACgB;AAChB,QAAO,WAAW,aAAa,MAAM;;AAyBvC,SAAgB,aAAa,SAAyC;AACpE,QAAO;EACL,YAAY,QAAgB,QAAQ,SAAS,KAAK,gBAAgB;EAClE,mBAAmB,QACjB,QAAQ,SAAS,KAAK,uBAAuB;EAC/C,gBAAgB,QAAgB,YAAY,SAAS,KAAK,gBAAgB;EAC1E,SAAS,QAAgB,QAAQ,SAAS,KAAK,aAAa;EAC5D,aAAa,QAAgB,YAAY,SAAS,KAAK,aAAa;EACpE,aAAa,QAAgB,QAAQ,SAAS,KAAK,iBAAiB;EACpE,iBAAiB,QACf,YAAY,SAAS,KAAK,iBAAiB;EAC7C,WAAW,QAAgB,QAAQ,SAAS,KAAK,eAAe;EAChE,eAAe,QAAgB,YAAY,SAAS,KAAK,eAAe;EACxE,eAAe,QAAgB,QAAQ,SAAS,KAAK,mBAAmB;EACxE,mBAAmB,QACjB,YAAY,SAAS,KAAK,mBAAmB;EAC/C,YAAY,QAAgB,QAAQ,SAAS,KAAK,gBAAgB;EAClE,gBAAgB,QAAgB,YAAY,SAAS,KAAK,gBAAgB;EAC1E,YAAY,KAAa,gBACvB,QAAQ,SAAS,KAAK,iBAAiB,YAAY;EACrD,gBAAgB,KAAa,gBAC3B,YAAY,SAAS,KAAK,iBAAiB,YAAY;EACzD,eAAe,QAAgB,QAAQ,SAAS,KAAK,mBAAmB;EACxE,mBAAmB,QACjB,YAAY,SAAS,KAAK,mBAAmB;EAC/C,WAAW,KAAa,gBACtB,QAAQ,SAAS,KAAK,gBAAgB,YAAY;EACrD"}