rescript-openapi 0.1.0

Generate type-safe ReScript clients from OpenAPI specifications
Documentation
---
source: tests/codegen_tests.rs
assertion_line: 55
expression: schema
---
// SPDX-License-Identifier: PMPL-1.0-or-later
// Generated by rescript-openapi - DO NOT EDIT
// Source: Complex API v2.0.0

open ApiTypes

module S = RescriptSchema.S

let catSchema: S.t<cat> = S.object(s => ({
  name: s.field("name", S.string),
  meowVolume: s.field("meowVolume", S.int),
}: cat))

let dogSchema: S.t<dog> = S.object(s => ({
  name: s.field("name", S.string),
  barkPitch: s.field("barkPitch", S.union([S.literal(#"low"), S.literal(#"medium"), S.literal(#"high")])),
}: dog))

let emailNotificationSchema: S.t<emailNotification> = S.object(s => ({
  type_: s.field("type", S.union([S.literal(#"email")])),
  to_: s.field("to", S.string),
  subject: s.field("subject", S.string),
  body: s.field("body", S.string),
  html: s.fieldOr("html", S.option(S.bool), None),
}: emailNotification))

let errorSchema: S.t<error> = S.object(s => ({
  code: s.field("code", S.string),
  message: s.field("message", S.string),
  details: s.fieldOr("details", S.option(S.array(S.json)), None),
}: error))

let eventSchema: S.t<event> = S.object(s => ({
  id: s.field("id", S.string),
  type_: s.field("type", S.union([S.literal(#"user.created"), S.literal(#"user.updated"), S.literal(#"user.deleted"), S.literal(#"order.placed")])),
  timestamp: s.field("timestamp", S.datetime),
  payload: s.field("payload", S.json),
}: event))

let orderEventPayloadSchema: S.t<orderEventPayload> = S.object(s => ({
  orderId: s.field("orderId", S.string),
  amount: s.field("amount", S.float),
  currency: s.fieldOr("currency", S.option(S.string), None),
}: orderEventPayload))

let paginationMetaSchema: S.t<paginationMeta> = S.object(s => ({
  total: s.field("total", S.int),
  limit: s.field("limit", S.int),
  offset: s.field("offset", S.int),
  hasMore: s.fieldOr("hasMore", S.option(S.bool), None),
}: paginationMeta))

let pushNotificationSchema: S.t<pushNotification> = S.object(s => ({
  type_: s.field("type", S.union([S.literal(#"push")])),
  deviceToken: s.field("deviceToken", S.string),
  title: s.field("title", S.string),
  message: s.field("message", S.string),
  badge: s.fieldOr("badge", S.option(S.int), None),
  sound: s.fieldOr("sound", S.option(S.string), None),
}: pushNotification))

let smsNotificationSchema: S.t<smsNotification> = S.object(s => ({
  type_: s.field("type", S.union([S.literal(#"sms")])),
  phoneNumber: s.field("phoneNumber", S.string),
  message: s.field("message", S.string),
}: smsNotification))

let userEventPayloadSchema: S.t<userEventPayload> = S.object(s => ({
  userId: s.field("userId", S.string),
  changes: s.fieldOr("changes", S.option(S.json), None),
}: userEventPayload))

let userProfileSchema: S.t<userProfile> = S.object(s => ({
  firstName: s.field("firstName", S.string),
  lastName: s.field("lastName", S.string),
  avatar: s.fieldOr("avatar", S.option(S.string), None),
  bio: s.fieldOr("bio", S.option(S.string), None),
  socialLinks: s.fieldOr("socialLinks", S.option(S.json), None),
}: userProfile))

let userSettingsSchema: S.t<userSettings> = S.object(s => ({
  theme: s.fieldOr("theme", S.option(S.union([S.literal(#"light"), S.literal(#"dark"), S.literal(#"system")])), None),
  language: s.fieldOr("language", S.option(S.string), None),
  notifications: s.fieldOr("notifications", S.option(S.json), None),
}: userSettings))

let petSchema: S.t<pet> = S.union([
  catSchema->S.transform(s => {
    parser: v => Cat(v),
    serializer: v => switch v { | Cat(x) => x | _ => S.fail("Expected Cat") }
  }),
  dogSchema->S.transform(s => {
    parser: v => Dog(v),
    serializer: v => switch v { | Dog(x) => x | _ => S.fail("Expected Dog") }
  }),
])

let notificationSchema: S.t<notification> = S.union([
  emailNotificationSchema->S.transform(s => {
    parser: v => EmailNotification(v),
    serializer: v => switch v { | EmailNotification(x) => x | _ => S.fail("Expected EmailNotification") }
  }),
  pushNotificationSchema->S.transform(s => {
    parser: v => PushNotification(v),
    serializer: v => switch v { | PushNotification(x) => x | _ => S.fail("Expected PushNotification") }
  }),
  smsNotificationSchema->S.transform(s => {
    parser: v => SmsNotification(v),
    serializer: v => switch v { | SmsNotification(x) => x | _ => S.fail("Expected SmsNotification") }
  }),
])

let createUserRequestSchema: S.t<createUserRequest> = S.object(s => ({
  email: s.field("email", S.string),
  password: s.field("password", S.string),
  profile: s.field("profile", userProfileSchema),
  settings: s.fieldOr("settings", S.option(userSettingsSchema), None),
}: createUserRequest))

let userSchema: S.t<user> = S.object(s => ({
  id: s.field("id", S.string),
  email: s.field("email", S.string),
  profile: s.field("profile", userProfileSchema),
  settings: s.fieldOr("settings", S.option(userSettingsSchema), None),
  createdAt: s.fieldOr("createdAt", S.option(S.datetime), None),
  updatedAt: s.fieldOr("updatedAt", S.option(S.datetime), None),
}: user))

let searchResultSchema: S.t<searchResult> = S.union([
  userSchema->S.transform(s => {
    parser: v => User(v),
    serializer: v => switch v { | User(x) => x | _ => S.fail("Expected User") }
  }),
  orderEventPayloadSchema->S.transform(s => {
    parser: v => OrderEventPayload(v),
    serializer: v => switch v { | OrderEventPayload(x) => x | _ => S.fail("Expected OrderEventPayload") }
  }),
  S.json->S.transform(s => {
    parser: v => TextMatch(v),
    serializer: v => switch v { | TextMatch(x) => x | _ => S.fail("Expected TextMatch") }
  }),
])