/*
 * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
 */

import * as z from "zod/v3";
import { remap as remap$ } from "../../lib/primitives.js";
import { safeParse } from "../../lib/schemas.js";
import { Result as SafeParseResult } from "../../types/fp.js";
import * as types from "../../types/primitives.js";
import { SDKValidationError } from "../errors/sdkvalidationerror.js";

export type ResourceMetadata = {
  /**
   * Timestamp when the agreement document was created.
   */
  createdAt?: Date | null | undefined;
  /**
   * User ID of the person who created the agreement document.
   */
  createdBy?: string | null | undefined;
  /**
   * Timestamp when the agreement document was last modified.
   */
  modifiedAt?: Date | null | undefined;
  /**
   * User ID of the person who last modified the agreement document.
   */
  modifiedBy?: string | null | undefined;
  /**
   * Unique identifier for the request, useful for tracking and debugging.
   */
  requestId?: string | null | undefined;
  /**
   * The timestamp indicating when the response was generated.
   */
  responseTimestamp?: Date | null | undefined;
  /**
   * The duration of time, in milliseconds, that the server took to process and respond
   *
   * @remarks
   * to the request. This is measured from the time the server received the request
   * until the time the response was sent.
   */
  responseDurationMs?: number | null | undefined;
};

/** @internal */
export const ResourceMetadata$inboundSchema: z.ZodType<
  ResourceMetadata,
  z.ZodTypeDef,
  unknown
> = z.object({
  created_at: z.nullable(types.date()).optional(),
  created_by: z.nullable(types.string()).optional(),
  modified_at: z.nullable(types.date()).optional(),
  modified_by: z.nullable(types.string()).optional(),
  request_id: z.nullable(types.string()).optional(),
  response_timestamp: z.nullable(types.date()).optional(),
  response_duration_ms: z.nullable(types.number()).optional(),
}).transform((v) => {
  return remap$(v, {
    "created_at": "createdAt",
    "created_by": "createdBy",
    "modified_at": "modifiedAt",
    "modified_by": "modifiedBy",
    "request_id": "requestId",
    "response_timestamp": "responseTimestamp",
    "response_duration_ms": "responseDurationMs",
  });
});
/** @internal */
export type ResourceMetadata$Outbound = {
  created_at?: string | null | undefined;
  created_by?: string | null | undefined;
  modified_at?: string | null | undefined;
  modified_by?: string | null | undefined;
  request_id?: string | null | undefined;
  response_timestamp?: string | null | undefined;
  response_duration_ms?: number | null | undefined;
};

/** @internal */
export const ResourceMetadata$outboundSchema: z.ZodType<
  ResourceMetadata$Outbound,
  z.ZodTypeDef,
  ResourceMetadata
> = z.object({
  createdAt: z.nullable(z.date().transform(v => v.toISOString())).optional(),
  createdBy: z.nullable(z.string()).optional(),
  modifiedAt: z.nullable(z.date().transform(v => v.toISOString())).optional(),
  modifiedBy: z.nullable(z.string()).optional(),
  requestId: z.nullable(z.string()).optional(),
  responseTimestamp: z.nullable(z.date().transform(v => v.toISOString()))
    .optional(),
  responseDurationMs: z.nullable(z.number().int()).optional(),
}).transform((v) => {
  return remap$(v, {
    createdAt: "created_at",
    createdBy: "created_by",
    modifiedAt: "modified_at",
    modifiedBy: "modified_by",
    requestId: "request_id",
    responseTimestamp: "response_timestamp",
    responseDurationMs: "response_duration_ms",
  });
});

export function resourceMetadataToJSON(
  resourceMetadata: ResourceMetadata,
): string {
  return JSON.stringify(
    ResourceMetadata$outboundSchema.parse(resourceMetadata),
  );
}
export function resourceMetadataFromJSON(
  jsonString: string,
): SafeParseResult<ResourceMetadata, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => ResourceMetadata$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'ResourceMetadata' from JSON`,
  );
}
