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

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

export type ListAccessGroupProjectsRequest = {
  /**
   * The ID or name of the Access Group.
   */
  idOrName: string;
  /**
   * Limit how many access group projects should be returned.
   */
  limit?: number | undefined;
  /**
   * Continuation cursor to retrieve the next page of results.
   */
  next?: string | undefined;
  /**
   * The Team identifier to perform the request on behalf of.
   */
  teamId?: string | undefined;
  /**
   * The Team slug to perform the request on behalf of.
   */
  slug?: string | undefined;
};

export const ListAccessGroupProjectsRole = {
  Admin: "ADMIN",
  ProjectDeveloper: "PROJECT_DEVELOPER",
  ProjectGuest: "PROJECT_GUEST",
  ProjectViewer: "PROJECT_VIEWER",
} as const;
export type ListAccessGroupProjectsRole = ClosedEnum<
  typeof ListAccessGroupProjectsRole
>;

export type ListAccessGroupProjectsProject = {
  name?: string | undefined;
  framework?: string | null | undefined;
  latestDeploymentId?: string | undefined;
};

export type ListAccessGroupProjectsProjects = {
  projectId: string;
  role: ListAccessGroupProjectsRole;
  createdAt: string;
  updatedAt: string;
  project: ListAccessGroupProjectsProject;
};

export type ListAccessGroupProjectsPagination = {
  count: number;
  next: string | null;
};

export type ListAccessGroupProjectsResponseBody = {
  projects: Array<ListAccessGroupProjectsProjects>;
  pagination: ListAccessGroupProjectsPagination;
};

/** @internal */
export type ListAccessGroupProjectsRequest$Outbound = {
  idOrName: string;
  limit?: number | undefined;
  next?: string | undefined;
  teamId?: string | undefined;
  slug?: string | undefined;
};

/** @internal */
export const ListAccessGroupProjectsRequest$outboundSchema: z.ZodType<
  ListAccessGroupProjectsRequest$Outbound,
  z.ZodTypeDef,
  ListAccessGroupProjectsRequest
> = z.object({
  idOrName: z.string(),
  limit: z.number().int().optional(),
  next: z.string().optional(),
  teamId: z.string().optional(),
  slug: z.string().optional(),
});

export function listAccessGroupProjectsRequestToJSON(
  listAccessGroupProjectsRequest: ListAccessGroupProjectsRequest,
): string {
  return JSON.stringify(
    ListAccessGroupProjectsRequest$outboundSchema.parse(
      listAccessGroupProjectsRequest,
    ),
  );
}

/** @internal */
export const ListAccessGroupProjectsRole$inboundSchema: z.ZodNativeEnum<
  typeof ListAccessGroupProjectsRole
> = z.nativeEnum(ListAccessGroupProjectsRole);

/** @internal */
export const ListAccessGroupProjectsProject$inboundSchema: z.ZodType<
  ListAccessGroupProjectsProject,
  z.ZodTypeDef,
  unknown
> = z.object({
  name: types.optional(types.string()),
  framework: z.nullable(types.string()).optional(),
  latestDeploymentId: types.optional(types.string()),
});

export function listAccessGroupProjectsProjectFromJSON(
  jsonString: string,
): SafeParseResult<ListAccessGroupProjectsProject, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => ListAccessGroupProjectsProject$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'ListAccessGroupProjectsProject' from JSON`,
  );
}

/** @internal */
export const ListAccessGroupProjectsProjects$inboundSchema: z.ZodType<
  ListAccessGroupProjectsProjects,
  z.ZodTypeDef,
  unknown
> = z.object({
  projectId: types.string(),
  role: ListAccessGroupProjectsRole$inboundSchema,
  createdAt: types.string(),
  updatedAt: types.string(),
  project: z.lazy(() => ListAccessGroupProjectsProject$inboundSchema),
});

export function listAccessGroupProjectsProjectsFromJSON(
  jsonString: string,
): SafeParseResult<ListAccessGroupProjectsProjects, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => ListAccessGroupProjectsProjects$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'ListAccessGroupProjectsProjects' from JSON`,
  );
}

/** @internal */
export const ListAccessGroupProjectsPagination$inboundSchema: z.ZodType<
  ListAccessGroupProjectsPagination,
  z.ZodTypeDef,
  unknown
> = z.object({
  count: types.number(),
  next: types.nullable(types.string()),
});

export function listAccessGroupProjectsPaginationFromJSON(
  jsonString: string,
): SafeParseResult<ListAccessGroupProjectsPagination, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => ListAccessGroupProjectsPagination$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'ListAccessGroupProjectsPagination' from JSON`,
  );
}

/** @internal */
export const ListAccessGroupProjectsResponseBody$inboundSchema: z.ZodType<
  ListAccessGroupProjectsResponseBody,
  z.ZodTypeDef,
  unknown
> = z.object({
  projects: z.array(
    z.lazy(() => ListAccessGroupProjectsProjects$inboundSchema),
  ),
  pagination: z.lazy(() => ListAccessGroupProjectsPagination$inboundSchema),
});

export function listAccessGroupProjectsResponseBodyFromJSON(
  jsonString: string,
): SafeParseResult<ListAccessGroupProjectsResponseBody, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) =>
      ListAccessGroupProjectsResponseBody$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'ListAccessGroupProjectsResponseBody' from JSON`,
  );
}
