import std/json, std/times import notion_utils, timeutils type EventProposal* = object name*: string description*: string purpose*: string department*: string owner*: string location*: string date*: DateTime budgetInDollars*: int MultiSelectOption = tuple[value: string, color: string] EventProposalConfig* = object departmentOptions*: seq[MultiSelectOption] proc getOrFail(n: JsonNode, key: string): JsonNode = ## convenience method to get a key from a JObject or raise an exception if not n.hasKey(key): raise newException(ValueError, "missing key '" & key & "'") return n[key] proc parseIso8601(n: JsonNode, key: string): DateTime = return parseIso8601(n.getOrFail(key).getStr) proc parseEventProposal*(n: JsonNode): EventProposal {.raises: [JsonParsingError].} = try: result = EventProposal( name: n.getOrFail("name").getStr, description: n.getOrFail("description").getStr, purpose: n.getOrFail("purpose").getStr, department: n.getOrFail("department").getStr, location: n.getOrFail("location").getStr, owner: n.getOrFail("owner").getStr, date: n.parseIso8601("date"), budgetInDollars: n.getOrFail("budgetInDollars").getInt) except: raise newException(JsonParsingError, "Invalid EventProposal: " & getCurrentExceptionMsg()) proc asNotionPage*(ep: EventProposal): JsonNode = result = %*{ "properties": { "Event": makeTextProp("title", ep.name), "Date": { "date": { "start": formatIso8601(ep.date) } }, "Department": { "multi_select": [ { "name": ep.department } ] }, "Location": makeTextProp("rich_text", ep.location), "Owner": makeTextProp("rich_text", ep.owner), "State": { "select": { "name": "Proposed" } }, "Visibility": { "select": { "name": "Public" } } }, "children": [ { "object": "block", "type": "heading_2", "heading_2": makeTextProp("text", "Purpose") }, { "object": "block", "type": "paragraph", "paragraph": makeTextProp("text", ep.purpose) }, { "object": "block", "type": "heading_2", "heading_2": makeTextProp("text", "Description") }, { "object": "block", "type": "paragraph", "paragraph": makeTextProp("text", ep.description) } ] } proc `%`(mso: MultiSelectOption): JsonNode = %*{ "value": mso.value, "color": mso.color } proc `%`*(epc: EventProposalConfig): JsonNode = %*{ "departments": epc.departmentOptions }