///|
/// A normalized notification. Unknown notification kinds decode as `Unknown`.
pub(all) struct Notification {
  id : String
  notification_type : NotificationType
  created_at : String
  account : Account
  status : Status?
  raw : Json
} derive(Eq, Debug)

///|
pub fn Notification::from_json(
  json : Json,
) -> Notification raise @api.MegalodonError {
  let fields = object_of(json, "Notification")
  guard fields.get("account") is Some(account) else {
    raise @api.InvalidEntity(entity="Notification", detail="missing account")
  }
  let status = match fields.get("status") {
    Some(Null) | None => None
    Some(value) => Some(Status::from_json(value))
  }
  {
    id: required_string(fields, "id", "Notification"),
    notification_type: NotificationType::parse(
      required_string(fields, "type", "Notification"),
    ),
    created_at: required_string(fields, "created_at", "Notification"),
    account: Account::from_json(account),
    status,
    raw: json,
  }
}

///|
pub fn Notification::to_json(self : Self) -> Json {
  self.raw
}