diff --git a/cli-node/package.json b/cli-node/package.json index f2ce6e9..6c6c6e9 100644 --- a/cli-node/package.json +++ b/cli-node/package.json @@ -104,6 +104,9 @@ "memories": { "description": "Store durable JSON memories by key. Use `primitive memories set|get|delete|search`; pass `--function ` for function-scoped memories." }, + "templates": { + "description": "Browse and install Function templates. Use `primitive templates list-templates`, `primitive templates get-template`, `primitive templates install-template`, and `primitive templates get-template-install`." + }, "org": { "description": "Manage org-level (global) resources shared across functions" }, diff --git a/cli-node/tests/oclif/commands-manifest-coverage.test.ts b/cli-node/tests/oclif/commands-manifest-coverage.test.ts index e104c32..aeb889d 100644 --- a/cli-node/tests/oclif/commands-manifest-coverage.test.ts +++ b/cli-node/tests/oclif/commands-manifest-coverage.test.ts @@ -18,6 +18,7 @@ function readCliPackageJson(): { message?: string; timeoutInDays?: number; }; + topicSeparator?: string; }; scripts?: Record; } { @@ -197,6 +198,17 @@ describe("COMMANDS / manifest coverage", () => { expect(COMMANDS["memories:set"]).not.toBe(COMMANDS["memories:set-memory"]); }); + it("registers template API operations", () => { + for (const id of [ + "templates:list-templates", + "templates:get-template", + "templates:install-template", + "templates:get-template-install", + ]) { + expect(COMMANDS[id]).toBeDefined(); + } + }); + it("registers semantic search as a top-level command", () => { expect(COMMANDS["semantic-search"]).toBeDefined(); const semanticSearchCommand = COMMANDS["semantic-search"] as unknown as { @@ -303,6 +315,15 @@ describe("COMMANDS / manifest coverage", () => { ); }); + it("documents template commands in root help", () => { + const packageJson = readCliPackageJson(); + const description = packageJson.oclif?.topics?.templates?.description ?? ""; + + expect(packageJson.oclif?.topicSeparator).toBe(" "); + expect(description).toContain("primitive templates list-templates"); + expect(description).toContain("primitive templates install-template"); + }); + it("documents active chat replies in root help", () => { const packageJson = readCliPackageJson(); diff --git a/cli-node/tests/oclif/templates.test.ts b/cli-node/tests/oclif/templates.test.ts new file mode 100644 index 0000000..18eaa16 --- /dev/null +++ b/cli-node/tests/oclif/templates.test.ts @@ -0,0 +1,274 @@ +import { resolve } from "node:path"; +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const mocks = vi.hoisted(() => ({ + createAuthenticatedCliApiClient: vi.fn(), + getTemplate: vi.fn(), + getTemplateInstall: vi.fn(), + installTemplate: vi.fn(), + listTemplates: vi.fn(), +})); + +vi.mock("@primitivedotdev/api-core", async (importOriginal) => { + const actual = + await importOriginal(); + return { + ...actual, + getTemplate: mocks.getTemplate, + getTemplateInstall: mocks.getTemplateInstall, + installTemplate: mocks.installTemplate, + listTemplates: mocks.listTemplates, + operations: { + ...actual.operations, + getTemplate: mocks.getTemplate, + getTemplateInstall: mocks.getTemplateInstall, + installTemplate: mocks.installTemplate, + listTemplates: mocks.listTemplates, + }, + }; +}); + +vi.mock("../../src/oclif/api-client.js", () => ({ + createAuthenticatedCliApiClient: mocks.createAuthenticatedCliApiClient, +})); + +import { COMMANDS } from "../../src/oclif/index.js"; + +const CLI_ROOT = resolve(import.meta.dirname, "../.."); +const TEMPLATE_SLUG = "reply-bot"; +const INSTALL_ID = "11111111-1111-4111-8111-111111111111"; + +type RunnableTemplateCommand = { + run(argv: string[], options: { root: string }): Promise; +}; + +function templateCommand(id: string): RunnableTemplateCommand { + const command = COMMANDS[id] as unknown as + | RunnableTemplateCommand + | undefined; + if (!command) throw new Error(`Missing command ${id}`); + return command; +} + +async function runTemplateCommand( + command: RunnableTemplateCommand, + argv: string[], +): Promise<{ + exitCode: NodeJS.Process["exitCode"]; + stdout: string; + stderr: string; +}> { + const stdoutChunks: string[] = []; + const stderrChunks: string[] = []; + const previousExitCode = process.exitCode; + process.exitCode = undefined; + const logSpy = vi.spyOn(console, "log").mockImplementation((message = "") => { + stdoutChunks.push(`${String(message)}\n`); + }); + const stderrSpy = vi + .spyOn(process.stderr, "write") + .mockImplementation((chunk) => { + stderrChunks.push(String(chunk)); + return true; + }); + + try { + await command.run(argv, { root: CLI_ROOT }); + return { + exitCode: process.exitCode, + stdout: stdoutChunks.join(""), + stderr: stderrChunks.join(""), + }; + } finally { + logSpy.mockRestore(); + stderrSpy.mockRestore(); + process.exitCode = previousExitCode; + } +} + +beforeEach(() => { + vi.clearAllMocks(); + mocks.createAuthenticatedCliApiClient.mockResolvedValue({ + apiClient: { client: { host: "api" } }, + auth: { kind: "api-key" }, + baseUrlOverridden: false, + }); + mocks.listTemplates.mockResolvedValue({ + data: { + data: { + items: [ + { + id: "22222222-2222-4222-8222-222222222222", + slug: TEMPLATE_SLUG, + title: "Reply Bot", + summary: "Replies to inbound mail", + author: { id: "primitive", name: "Primitive" }, + tags: ["email"], + verified: true, + install_count: 3, + github_repo: "primitive/templates", + created_at: "2026-07-01T00:00:00.000Z", + updated_at: "2026-07-01T00:00:00.000Z", + }, + ], + next_cursor: null, + }, + }, + }); + mocks.getTemplate.mockResolvedValue({ + data: { + data: { + id: "22222222-2222-4222-8222-222222222222", + slug: TEMPLATE_SLUG, + title: "Reply Bot", + summary: "Replies to inbound mail", + description: null, + author: { id: "primitive", name: "Primitive" }, + tags: ["email"], + verified: true, + install_count: 3, + github_repo: "primitive/templates", + github_sha: "abc123", + github_path: null, + manifest: { + schemaVersion: 1, + id: TEMPLATE_SLUG, + title: "Reply Bot", + summary: "Replies to inbound mail", + author: { id: "primitive", name: "Primitive" }, + tags: ["email"], + source: { mode: "managed-build", dir: "." }, + install: { mode: "deploy", editFiles: [], reason: "" }, + secrets: [], + secretGroups: [], + variables: [], + }, + readme: null, + status: "approved", + created_at: "2026-07-01T00:00:00.000Z", + updated_at: "2026-07-01T00:00:00.000Z", + }, + }, + }); + mocks.installTemplate.mockResolvedValue({ + data: { + data: { + id: INSTALL_ID, + template_slug: TEMPLATE_SLUG, + state: "deploying", + address: "reply@example.com", + function_id: null, + error: null, + created_at: "2026-07-01T00:00:00.000Z", + updated_at: "2026-07-01T00:00:00.000Z", + }, + }, + }); + mocks.getTemplateInstall.mockResolvedValue({ + data: { + data: { + id: INSTALL_ID, + template_slug: TEMPLATE_SLUG, + state: "tested", + address: "reply@example.com", + function_id: "33333333-3333-4333-8333-333333333333", + error: null, + created_at: "2026-07-01T00:00:00.000Z", + updated_at: "2026-07-01T00:00:00.000Z", + }, + }, + }); +}); + +describe("templates command registration", () => { + it.each([ + "templates:list-templates", + "templates:get-template", + "templates:install-template", + "templates:get-template-install", + ])("registers %s", (id) => { + expect(COMMANDS[id]).toBeDefined(); + }); +}); + +describe("templates black-box command invocation", () => { + it("runs list/get/install/status with the user-facing command shapes", async () => { + await expect( + runTemplateCommand(templateCommand("templates:list-templates"), [ + "--q", + "reply", + "--tag", + "email", + "--limit", + "25", + "--cursor", + "next-page", + ]), + ).resolves.toMatchObject({ exitCode: undefined }); + expect(mocks.listTemplates).toHaveBeenCalledWith( + expect.objectContaining({ + client: { host: "api" }, + query: { + q: "reply", + tag: "email", + limit: 25, + cursor: "next-page", + }, + }), + ); + + await expect( + runTemplateCommand(templateCommand("templates:get-template"), [ + "--id", + TEMPLATE_SLUG, + ]), + ).resolves.toMatchObject({ exitCode: undefined }); + expect(mocks.getTemplate).toHaveBeenCalledWith( + expect.objectContaining({ + client: { host: "api" }, + path: { id: TEMPLATE_SLUG }, + }), + ); + + await expect( + runTemplateCommand(templateCommand("templates:install-template"), [ + "--id", + TEMPLATE_SLUG, + "--address", + "reply", + "--domain", + "example.com", + "--raw-body", + JSON.stringify({ + secrets: { ANTHROPIC_API_KEY: "sk-test" }, + variables: { TONE: "brief" }, + }), + ]), + ).resolves.toMatchObject({ exitCode: undefined }); + expect(mocks.installTemplate).toHaveBeenCalledWith( + expect.objectContaining({ + body: { + address: "reply", + domain: "example.com", + secrets: { ANTHROPIC_API_KEY: "sk-test" }, + variables: { TONE: "brief" }, + }, + client: { host: "api" }, + path: { id: TEMPLATE_SLUG }, + }), + ); + + await expect( + runTemplateCommand(templateCommand("templates:get-template-install"), [ + "--id", + INSTALL_ID, + ]), + ).resolves.toMatchObject({ exitCode: undefined }); + expect(mocks.getTemplateInstall).toHaveBeenCalledWith( + expect.objectContaining({ + client: { host: "api" }, + path: { id: INSTALL_ID }, + }), + ); + }); +}); diff --git a/openapi/primitive-api.codegen.json b/openapi/primitive-api.codegen.json index cb4d9c6..eb9c386 100644 --- a/openapi/primitive-api.codegen.json +++ b/openapi/primitive-api.codegen.json @@ -97,6 +97,10 @@ "name": "Memories", "description": "Durable org-scoped or function-scoped JSON key-value storage for\nagents and functions. Keys are caller-defined. Function scope is\nalways addressed by the function id UUID, not by function name.\n" }, + { + "name": "Templates", + "description": "Browse approved Function templates, install deploy-mode templates, and\npoll install progress.\n" + }, { "name": "Registries", "description": "The Agent Registry: ownable directories of agents, addressable by a\nregistry-scoped handle. A registry's publish policy (owner_only, request,\nor open) decides whether a publish lists immediately or pends owner\napproval. An agent is defined once with a globally unique,\nreachability-verified address, then published into any registry under a\nhandle. Discovery reads (list, resolve, get) are public for public\nregistries; managing a registry and moderating requests use the owner's\nAPI key.\n" @@ -5686,6 +5690,307 @@ } } }, + "/templates": { + "get": { + "operationId": "listTemplates", + "summary": "List function templates", + "description": "List approved Function templates available for browsing and\ninstallation. Results are cacheable and paginated with\n`data.next_cursor`.\n", + "tags": [ + "Templates" + ], + "security": [], + "parameters": [ + { + "name": "q", + "in": "query", + "required": false, + "description": "Search templates by title, summary, or slug.", + "schema": { + "type": "string", + "minLength": 1 + } + }, + { + "name": "tag", + "in": "query", + "required": false, + "description": "Filter templates by an exact tag.", + "schema": { + "type": "string", + "minLength": 1 + } + }, + { + "name": "cursor", + "in": "query", + "required": false, + "description": "Cursor from a previous response `data.next_cursor` value.", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "description": "Maximum number of templates to return. The server caps this at 100.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + } + } + ], + "responses": { + "200": { + "description": "Paginated template registry summaries", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/SuccessEnvelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TemplateRegistryPage" + } + }, + "required": [ + "data" + ] + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/ValidationError" + }, + "429": { + "$ref": "#/components/responses/RateLimited" + } + } + } + }, + "/templates/{id}": { + "get": { + "operationId": "getTemplate", + "summary": "Get a function template", + "description": "Fetch one approved Function template by slug, including its manifest\nsnapshot and README. The stored source files used for install are not\nreturned.\n", + "tags": [ + "Templates" + ], + "security": [], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "Template slug from the template manifest.", + "schema": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$" + } + } + ], + "responses": { + "200": { + "description": "Template registry detail", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/SuccessEnvelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TemplateRegistryDetail" + } + }, + "required": [ + "data" + ] + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/ValidationError" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "429": { + "$ref": "#/components/responses/RateLimited" + } + } + } + }, + "/templates/{id}/install": { + "post": { + "operationId": "installTemplate", + "summary": "Install a function template", + "description": "Start a one-shot deploy of an approved deploy-mode Function template.\nThe response returns an install record immediately; poll\n`GET /templates/installs/{id}` for progress.\n", + "tags": [ + "Templates" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "Template slug from the template manifest.", + "schema": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstallTemplateBody" + } + } + } + }, + "responses": { + "201": { + "description": "Template install started", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/SuccessEnvelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TemplateInstallStatus" + } + }, + "required": [ + "data" + ] + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/ValidationError" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "422": { + "$ref": "#/components/responses/UnprocessableEntity" + }, + "429": { + "$ref": "#/components/responses/RateLimited" + } + } + } + }, + "/templates/installs/{id}": { + "get": { + "operationId": "getTemplateInstall", + "summary": "Get template install status", + "description": "Fetch the current state of a template install. Reads may advance the\nself-test phase when a reply effect has been observed.\n", + "tags": [ + "Templates" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "Template install UUID.", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" + } + } + ], + "responses": { + "200": { + "description": "Current template install status", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/SuccessEnvelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TemplateInstallStatus" + } + }, + "required": [ + "data" + ] + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/ValidationError" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "429": { + "$ref": "#/components/responses/RateLimited" + } + } + } + }, "/x402/payout-addresses": { "post": { "operationId": "registerPayoutAddress", @@ -8334,6 +8639,16 @@ "org_not_accessible", "feature_disabled", "memory_conflict", + "template_not_installable", + "scaffold_only", + "invalid_variables", + "unknown_secrets", + "missing_secrets", + "no_inbound_domain", + "domain_cannot_send", + "address_taken", + "route_cap_reached", + "name_exhausted", "developer_usage_credit_exhausted", "no_payout_address", "ownership_proof_failed", @@ -14238,6 +14553,579 @@ "key", "scope" ] + }, + "TemplateAuthor": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "format": "uri" + } + }, + "required": [ + "id", + "name" + ] + }, + "TemplateSource": { + "oneOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "type": "string", + "const": "managed-build" + }, + "dir": { + "type": "string", + "minLength": 1, + "default": "." + } + }, + "required": [ + "mode", + "dir" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "type": "string", + "const": "bundle" + }, + "file": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "mode", + "file" + ] + } + ] + }, + "TemplateInstall": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "type": "string", + "enum": [ + "deploy", + "scaffold" + ] + }, + "editFiles": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "reason": { + "type": "string", + "default": "" + } + }, + "required": [ + "mode", + "editFiles", + "reason" + ] + }, + "TemplateSecret": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "type": "string", + "pattern": "^[A-Z_][A-Z0-9_]*$" + }, + "required": { + "type": "boolean", + "default": true + }, + "description": { + "type": "string" + } + }, + "required": [ + "key", + "required" + ] + }, + "TemplateSecretGroup": { + "type": "object", + "additionalProperties": false, + "properties": { + "keys": { + "type": "array", + "minItems": 2, + "items": { + "type": "string", + "pattern": "^[A-Z_][A-Z0-9_]*$" + } + }, + "min": { + "type": "integer", + "minimum": 1, + "default": 1 + }, + "description": { + "type": "string" + } + }, + "required": [ + "keys", + "min" + ] + }, + "TemplateVariableValidation": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string", + "minLength": 1 + }, + "maxLength": { + "type": "integer", + "minimum": 1 + } + } + }, + "TemplateVariable": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "type": "string", + "minLength": 1 + }, + "prompt": { + "type": "string", + "minLength": 1 + }, + "default": { + "type": "string" + }, + "file": { + "type": "string", + "minLength": 1 + }, + "type": { + "type": "string", + "enum": [ + "string", + "select", + "url", + "email" + ], + "default": "string" + }, + "options": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "validation": { + "$ref": "#/components/schemas/TemplateVariableValidation" + } + }, + "required": [ + "key", + "prompt", + "type" + ] + }, + "TemplateSetup": { + "type": "object", + "additionalProperties": false, + "properties": { + "agent": { + "type": "string", + "minLength": 1 + }, + "prompt": { + "type": "string", + "minLength": 1 + }, + "produces": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + } + }, + "required": [ + "agent", + "prompt", + "produces" + ] + }, + "TemplateManifest": { + "type": "object", + "additionalProperties": false, + "properties": { + "schemaVersion": { + "type": "integer", + "const": 1 + }, + "id": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$", + "description": "Stable template slug from the manifest." + }, + "title": { + "type": "string", + "minLength": 1 + }, + "summary": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "author": { + "$ref": "#/components/schemas/TemplateAuthor" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "source": { + "$ref": "#/components/schemas/TemplateSource" + }, + "install": { + "$ref": "#/components/schemas/TemplateInstall" + }, + "secrets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TemplateSecret" + } + }, + "secretGroups": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TemplateSecretGroup" + } + }, + "variables": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TemplateVariable" + } + }, + "setup": { + "$ref": "#/components/schemas/TemplateSetup" + }, + "postInstall": { + "type": "string" + } + }, + "required": [ + "schemaVersion", + "id", + "title", + "summary", + "author", + "tags", + "source", + "install", + "secrets", + "secretGroups", + "variables" + ] + }, + "TemplateRegistryStatus": { + "type": "string", + "enum": [ + "pending", + "approved", + "rejected" + ] + }, + "TemplateRegistrySummary": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "slug": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$", + "description": "Stable template slug used in template URLs and install commands." + }, + "title": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "author": { + "$ref": "#/components/schemas/TemplateAuthor" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "verified": { + "type": "boolean" + }, + "install_count": { + "type": "integer", + "minimum": 0 + }, + "github_repo": { + "type": "string", + "pattern": "^[A-Za-z0-9-]+/[A-Za-z0-9_.-]+$", + "description": "GitHub repository in owner/repo form." + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "id", + "slug", + "title", + "summary", + "author", + "tags", + "verified", + "install_count", + "github_repo", + "created_at", + "updated_at" + ] + }, + "TemplateRegistryDetail": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "slug": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$", + "description": "Stable template slug used in template URLs and install commands." + }, + "title": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "author": { + "$ref": "#/components/schemas/TemplateAuthor" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "verified": { + "type": "boolean" + }, + "install_count": { + "type": "integer", + "minimum": 0 + }, + "github_repo": { + "type": "string", + "pattern": "^[A-Za-z0-9-]+/[A-Za-z0-9_.-]+$", + "description": "GitHub repository in owner/repo form." + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "description": { + "type": "string", + "nullable": true + }, + "github_sha": { + "type": "string" + }, + "github_path": { + "type": "string", + "nullable": true + }, + "manifest": { + "$ref": "#/components/schemas/TemplateManifest" + }, + "readme": { + "type": "string", + "nullable": true + }, + "status": { + "$ref": "#/components/schemas/TemplateRegistryStatus" + } + }, + "required": [ + "id", + "slug", + "title", + "summary", + "author", + "tags", + "verified", + "install_count", + "github_repo", + "created_at", + "updated_at", + "description", + "github_sha", + "github_path", + "manifest", + "readme", + "status" + ] + }, + "TemplateRegistryPage": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TemplateRegistrySummary" + } + }, + "next_cursor": { + "type": "string", + "description": "Cursor to pass as the next `cursor` query value, or null when there are no more templates.", + "nullable": true + } + }, + "required": [ + "items", + "next_cursor" + ] + }, + "InstallTemplateBody": { + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9._-]{0,63}$", + "description": "Localpart to claim on the selected inbound domain. Defaults to the template slug." + }, + "domain": { + "type": "string", + "minLength": 3, + "description": "Org domain name to claim the address on. Defaults to the org's newest active domain." + }, + "variables": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Template variable values keyed by manifest variable key." + }, + "secrets": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Secret values keyed by manifest secret key." + } + } + }, + "TemplateInstallState": { + "type": "string", + "enum": [ + "deploying", + "connecting", + "bound", + "tested", + "deploy_failed", + "bind_failed", + "test_failed" + ] + }, + "TemplateInstallStatus": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "template_slug": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$", + "description": "Template slug for this install." + }, + "state": { + "$ref": "#/components/schemas/TemplateInstallState" + }, + "address": { + "type": "string", + "nullable": true + }, + "function_id": { + "type": "string", + "format": "uuid", + "nullable": true + }, + "error": { + "type": "string", + "nullable": true + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "id", + "template_slug", + "state", + "address", + "function_id", + "error", + "created_at", + "updated_at" + ] } } } diff --git a/openapi/primitive-api.yaml b/openapi/primitive-api.yaml index 97bd44f..5958b28 100644 --- a/openapi/primitive-api.yaml +++ b/openapi/primitive-api.yaml @@ -201,6 +201,10 @@ tags: Durable org-scoped or function-scoped JSON key-value storage for agents and functions. Keys are caller-defined. Function scope is always addressed by the function id UUID, not by function name. + - name: Templates + description: | + Browse approved Function templates, install deploy-mode templates, and + poll install progress. - name: Registries description: | @@ -4218,6 +4222,199 @@ paths: '429': $ref: '#/components/responses/RateLimited' + # --------------------------------------------------------------------------- + # Function Templates + # --------------------------------------------------------------------------- + /templates: + get: + operationId: listTemplates + summary: List function templates + description: | + List approved Function templates available for browsing and + installation. Results are cacheable and paginated with + `data.next_cursor`. + tags: [Templates] + security: [] + parameters: + - name: q + in: query + required: false + description: Search templates by title, summary, or slug. + schema: + type: string + minLength: 1 + - name: tag + in: query + required: false + description: Filter templates by an exact tag. + schema: + type: string + minLength: 1 + - name: cursor + in: query + required: false + description: Cursor from a previous response `data.next_cursor` value. + schema: + type: string + - name: limit + in: query + required: false + description: Maximum number of templates to return. The server caps this at 100. + schema: + type: integer + minimum: 1 + maximum: 100 + default: 50 + responses: + '200': + description: Paginated template registry summaries + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/SuccessEnvelope' + - type: object + properties: + data: + $ref: '#/components/schemas/TemplateRegistryPage' + required: [data] + '400': + $ref: '#/components/responses/ValidationError' + '429': + $ref: '#/components/responses/RateLimited' + + /templates/{id}: + get: + operationId: getTemplate + summary: Get a function template + description: | + Fetch one approved Function template by slug, including its manifest + snapshot and README. The stored source files used for install are not + returned. + tags: [Templates] + security: [] + parameters: + - name: id + in: path + required: true + description: Template slug from the template manifest. + schema: + type: string + pattern: '^[a-z0-9][a-z0-9_-]{0,62}$' + responses: + '200': + description: Template registry detail + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/SuccessEnvelope' + - type: object + properties: + data: + $ref: '#/components/schemas/TemplateRegistryDetail' + required: [data] + '400': + $ref: '#/components/responses/ValidationError' + '404': + $ref: '#/components/responses/NotFound' + '429': + $ref: '#/components/responses/RateLimited' + + /templates/{id}/install: + post: + operationId: installTemplate + summary: Install a function template + description: | + Start a one-shot deploy of an approved deploy-mode Function template. + The response returns an install record immediately; poll + `GET /templates/installs/{id}` for progress. + tags: [Templates] + security: [{ BearerAuth: [] }] + parameters: + - name: id + in: path + required: true + description: Template slug from the template manifest. + schema: + type: string + pattern: '^[a-z0-9][a-z0-9_-]{0,62}$' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/InstallTemplateBody' + responses: + '201': + description: Template install started + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/SuccessEnvelope' + - type: object + properties: + data: + $ref: '#/components/schemas/TemplateInstallStatus' + required: [data] + '400': + $ref: '#/components/responses/ValidationError' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '409': + $ref: '#/components/responses/Conflict' + '422': + $ref: '#/components/responses/UnprocessableEntity' + '429': + $ref: '#/components/responses/RateLimited' + + /templates/installs/{id}: + get: + operationId: getTemplateInstall + summary: Get template install status + description: | + Fetch the current state of a template install. Reads may advance the + self-test phase when a reply effect has been observed. + tags: [Templates] + security: [{ BearerAuth: [] }] + parameters: + - name: id + in: path + required: true + description: Template install UUID. + schema: + type: string + format: uuid + pattern: '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$' + responses: + '200': + description: Current template install status + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/SuccessEnvelope' + - type: object + properties: + data: + $ref: '#/components/schemas/TemplateInstallStatus' + required: [data] + '400': + $ref: '#/components/responses/ValidationError' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '429': + $ref: '#/components/responses/RateLimited' + # --------------------------------------------------------------------------- # Payments (x402) # --------------------------------------------------------------------------- @@ -5883,6 +6080,16 @@ components: - org_not_accessible - feature_disabled - memory_conflict + - template_not_installable + - scaffold_only + - invalid_variables + - unknown_secrets + - missing_secrets + - no_inbound_domain + - domain_cannot_send + - address_taken + - route_cap_reached + - name_exhausted - developer_usage_credit_exhausted - no_payout_address - ownership_proof_failed @@ -10223,3 +10430,401 @@ components: scope: $ref: '#/components/schemas/MemoryResolvedScope' required: [deleted, key, scope] + + # ------------------------------------------------------------------------- + # Function Templates + # ------------------------------------------------------------------------- + TemplateAuthor: + type: object + additionalProperties: false + properties: + id: + type: string + minLength: 1 + name: + type: string + minLength: 1 + url: + type: string + format: uri + required: [id, name] + + TemplateSource: + oneOf: + - type: object + additionalProperties: false + properties: + mode: + type: string + const: managed-build + dir: + type: string + minLength: 1 + default: . + required: [mode, dir] + - type: object + additionalProperties: false + properties: + mode: + type: string + const: bundle + file: + type: string + minLength: 1 + required: [mode, file] + + TemplateInstall: + type: object + additionalProperties: false + properties: + mode: + type: string + enum: [deploy, scaffold] + editFiles: + type: array + items: + type: string + minLength: 1 + reason: + type: string + default: '' + required: [mode, editFiles, reason] + + TemplateSecret: + type: object + additionalProperties: false + properties: + key: + type: string + pattern: '^[A-Z_][A-Z0-9_]*$' + required: + type: boolean + default: true + description: + type: string + required: [key, required] + + TemplateSecretGroup: + type: object + additionalProperties: false + properties: + keys: + type: array + minItems: 2 + items: + type: string + pattern: '^[A-Z_][A-Z0-9_]*$' + min: + type: integer + minimum: 1 + default: 1 + description: + type: string + required: [keys, min] + + TemplateVariableValidation: + type: object + additionalProperties: false + properties: + pattern: + type: string + minLength: 1 + maxLength: + type: integer + minimum: 1 + + TemplateVariable: + type: object + additionalProperties: false + properties: + key: + type: string + minLength: 1 + prompt: + type: string + minLength: 1 + default: + type: string + file: + type: string + minLength: 1 + type: + type: string + enum: [string, select, url, email] + default: string + options: + type: array + items: + type: string + minLength: 1 + validation: + $ref: '#/components/schemas/TemplateVariableValidation' + required: [key, prompt, type] + + TemplateSetup: + type: object + additionalProperties: false + properties: + agent: + type: string + minLength: 1 + prompt: + type: string + minLength: 1 + produces: + type: array + items: + type: string + minLength: 1 + required: [agent, prompt, produces] + + TemplateManifest: + type: object + additionalProperties: false + properties: + schemaVersion: + type: integer + const: 1 + id: + type: string + pattern: '^[a-z0-9][a-z0-9_-]{0,62}$' + description: Stable template slug from the manifest. + title: + type: string + minLength: 1 + summary: + type: string + minLength: 1 + description: + type: string + author: + $ref: '#/components/schemas/TemplateAuthor' + tags: + type: array + items: + type: string + minLength: 1 + source: + $ref: '#/components/schemas/TemplateSource' + install: + $ref: '#/components/schemas/TemplateInstall' + secrets: + type: array + items: + $ref: '#/components/schemas/TemplateSecret' + secretGroups: + type: array + items: + $ref: '#/components/schemas/TemplateSecretGroup' + variables: + type: array + items: + $ref: '#/components/schemas/TemplateVariable' + setup: + $ref: '#/components/schemas/TemplateSetup' + postInstall: + type: string + required: + - schemaVersion + - id + - title + - summary + - author + - tags + - source + - install + - secrets + - secretGroups + - variables + + TemplateRegistryStatus: + type: string + enum: [pending, approved, rejected] + + TemplateRegistrySummary: + type: object + properties: + id: + type: string + format: uuid + slug: + type: string + pattern: '^[a-z0-9][a-z0-9_-]{0,62}$' + description: Stable template slug used in template URLs and install commands. + title: + type: string + summary: + type: string + author: + $ref: '#/components/schemas/TemplateAuthor' + tags: + type: array + items: + type: string + verified: + type: boolean + install_count: + type: integer + minimum: 0 + github_repo: + type: string + pattern: '^[A-Za-z0-9-]+/[A-Za-z0-9_.-]+$' + description: GitHub repository in owner/repo form. + created_at: + type: string + format: date-time + updated_at: + type: string + format: date-time + required: + - id + - slug + - title + - summary + - author + - tags + - verified + - install_count + - github_repo + - created_at + - updated_at + + TemplateRegistryDetail: + type: object + properties: + id: + type: string + format: uuid + slug: + type: string + pattern: '^[a-z0-9][a-z0-9_-]{0,62}$' + description: Stable template slug used in template URLs and install commands. + title: + type: string + summary: + type: string + author: + $ref: '#/components/schemas/TemplateAuthor' + tags: + type: array + items: + type: string + verified: + type: boolean + install_count: + type: integer + minimum: 0 + github_repo: + type: string + pattern: '^[A-Za-z0-9-]+/[A-Za-z0-9_.-]+$' + description: GitHub repository in owner/repo form. + created_at: + type: string + format: date-time + updated_at: + type: string + format: date-time + description: + type: [string, 'null'] + github_sha: + type: string + github_path: + type: [string, 'null'] + manifest: + $ref: '#/components/schemas/TemplateManifest' + readme: + type: [string, 'null'] + status: + $ref: '#/components/schemas/TemplateRegistryStatus' + required: + - id + - slug + - title + - summary + - author + - tags + - verified + - install_count + - github_repo + - created_at + - updated_at + - description + - github_sha + - github_path + - manifest + - readme + - status + + TemplateRegistryPage: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/TemplateRegistrySummary' + next_cursor: + type: [string, 'null'] + description: Cursor to pass as the next `cursor` query value, or null when there are no more templates. + required: [items, next_cursor] + + InstallTemplateBody: + type: object + additionalProperties: false + properties: + address: + type: string + pattern: '^[a-z0-9][a-z0-9._-]{0,63}$' + description: Localpart to claim on the selected inbound domain. Defaults to the template slug. + domain: + type: string + minLength: 3 + description: Org domain name to claim the address on. Defaults to the org's newest active domain. + variables: + type: object + additionalProperties: + type: string + description: Template variable values keyed by manifest variable key. + secrets: + type: object + additionalProperties: + type: string + description: Secret values keyed by manifest secret key. + + TemplateInstallState: + type: string + enum: [deploying, connecting, bound, tested, deploy_failed, bind_failed, test_failed] + + TemplateInstallStatus: + type: object + properties: + id: + type: string + format: uuid + template_slug: + type: string + pattern: '^[a-z0-9][a-z0-9_-]{0,62}$' + description: Template slug for this install. + state: + $ref: '#/components/schemas/TemplateInstallState' + address: + type: [string, 'null'] + function_id: + type: [string, 'null'] + format: uuid + error: + type: [string, 'null'] + created_at: + type: string + format: date-time + updated_at: + type: string + format: date-time + required: + - id + - template_slug + - state + - address + - function_id + - error + - created_at + - updated_at diff --git a/packages/api-core/src/api/index.ts b/packages/api-core/src/api/index.ts index 4390386..6aec693 100644 --- a/packages/api-core/src/api/index.ts +++ b/packages/api-core/src/api/index.ts @@ -1,4 +1,4 @@ // This file is auto-generated by @hey-api/openapi-ts -export { addDomain, cliLogout, createAgentAccount, createAgentClaimLink, createChallenge, createEmailChallenge, createEndpoint, createFilter, createFunction, createFunctionSecret, createOrgSecret, createRegistry, createRoute, createWakeAuthorization, createWakeSchedule, decideRegistryRequest, defineAgent, deleteDomain, deleteEmail, deleteEndpoint, deleteFilter, deleteFunction, deleteFunctionSecret, deleteMemory, deleteOrgSecret, deleteRegistry, deleteRoute, deleteWakeAuthorization, deleteWakeSchedule, discardEmailContent, downloadAttachments, downloadDomainZoneFile, downloadRawEmail, getAccount, getAgent, getChallenge, getConversation, getEmail, getFunction, getFunctionRouting, getFunctionTestRunTrace, getInboxStatus, getMemory, getOrgRoutingTopology, getRegistry, getSendPermissions, getSentEmail, getSpendPolicy, getStorageStats, getThread, getWakeSchedule, getWebhookSecret, listDeclinedPayments, listDeliveries, listDomains, listEmails, listEndpoints, listFilters, listFunctionLogs, listFunctions, listFunctionSecrets, listOrgSecrets, listPayoutAddresses, listRegistries, listRegistryAgents, listRegistryRequests, listRoutes, listSentEmails, listWakeAuthorizations, listWakeDispatches, listWakeSchedules, type Options, payChallenge, pollCliLogin, publishAgent, registerPayoutAddress, reorderRoutes, replayDelivery, replayEmailWebhooks, replyToEmail, resendAgentSignupVerification, resendCliSignupVerification, resolveRegistryHandle, rotateWebhookSecret, runWakeSchedule, searchEmails, searchMemories, semanticSearch, sendEmail, setFunctionRoute, setFunctionSecret, setMemory, setOrgSecret, simulateRoute, startAgentClaim, startAgentSignup, startCliLogin, startCliSignup, testEndpoint, testFunction, unpublishAgent, unsetFunctionRoute, updateAccount, updateDomain, updateEndpoint, updateFilter, updateFunction, updateRegistry, updateRoute, updateSpendPolicy, updateWakeAuthorization, updateWakeSchedule, verifyAgentClaim, verifyAgentSignup, verifyCliSignup, verifyDomain } from './sdk.gen.js'; -export type { Account, AccountUpdated, AddDomainData, AddDomainError, AddDomainErrors, AddDomainInput, AddDomainResponse, AddDomainResponses, AgentAccountResult, AgentAccountUpgradeHint, AgentClaimLinkResult, AgentClaimResult, AgentClaimStartResult, AgentOrgRef, AgentSignupResendResult, AgentSignupStartResult, AgentSignupVerifyResult, ClientOptions, CliLoginPollResult, CliLoginStartResult, CliLogoutData, CliLogoutError, CliLogoutErrors, CliLogoutInput, CliLogoutResponse, CliLogoutResponses, CliLogoutResult, CliSignupResendResult, CliSignupStartResult, CliSignupVerifyResult, Conversation, ConversationMessage, CreateAgentAccountData, CreateAgentAccountError, CreateAgentAccountErrors, CreateAgentAccountInput, CreateAgentAccountResponse, CreateAgentAccountResponses, CreateAgentClaimLinkData, CreateAgentClaimLinkError, CreateAgentClaimLinkErrors, CreateAgentClaimLinkInput, CreateAgentClaimLinkResponse, CreateAgentClaimLinkResponses, CreateChallengeData, CreateChallengeError, CreateChallengeErrors, CreateChallengeInput, CreateChallengeResponse, CreateChallengeResponses, CreateEmailChallengeData, CreateEmailChallengeError, CreateEmailChallengeErrors, CreateEmailChallengeInput, CreateEmailChallengeResponse, CreateEmailChallengeResponses, CreateEndpointData, CreateEndpointError, CreateEndpointErrors, CreateEndpointInput, CreateEndpointResponse, CreateEndpointResponses, CreateFilterData, CreateFilterError, CreateFilterErrors, CreateFilterInput, CreateFilterResponse, CreateFilterResponses, CreateFunctionData, CreateFunctionError, CreateFunctionErrors, CreateFunctionInput, CreateFunctionResponse, CreateFunctionResponses, CreateFunctionResult, CreateFunctionSecretData, CreateFunctionSecretError, CreateFunctionSecretErrors, CreateFunctionSecretInput, CreateFunctionSecretResponse, CreateFunctionSecretResponses, CreateOrgSecretData, CreateOrgSecretError, CreateOrgSecretErrors, CreateOrgSecretInput, CreateOrgSecretResponse, CreateOrgSecretResponses, CreateRegistryData, CreateRegistryError, CreateRegistryErrors, CreateRegistryInput, CreateRegistryResponse, CreateRegistryResponses, CreateRouteData, CreateRouteError, CreateRouteErrors, CreateRouteInput, CreateRouteResponse, CreateRouteResponses, CreateWakeAuthorizationData, CreateWakeAuthorizationError, CreateWakeAuthorizationErrors, CreateWakeAuthorizationInput, CreateWakeAuthorizationResponse, CreateWakeAuthorizationResponses, CreateWakeScheduleData, CreateWakeScheduleError, CreateWakeScheduleErrors, CreateWakeScheduleInput, CreateWakeScheduleResponse, CreateWakeScheduleResponses, Cursor, DecideRegistryRequestData, DecideRegistryRequestError, DecideRegistryRequestErrors, DecideRegistryRequestInput, DecideRegistryRequestResponse, DecideRegistryRequestResponses, DefineAgentData, DefineAgentError, DefineAgentErrors, DefineAgentInput, DefineAgentResponse, DefineAgentResponses, DeleteDomainData, DeleteDomainError, DeleteDomainErrors, DeleteDomainResponse, DeleteDomainResponses, DeleteEmailData, DeleteEmailError, DeleteEmailErrors, DeleteEmailResponse, DeleteEmailResponses, DeleteEndpointData, DeleteEndpointError, DeleteEndpointErrors, DeleteEndpointResponse, DeleteEndpointResponses, DeleteFilterData, DeleteFilterError, DeleteFilterErrors, DeleteFilterResponse, DeleteFilterResponses, DeleteFunctionData, DeleteFunctionError, DeleteFunctionErrors, DeleteFunctionResponse, DeleteFunctionResponses, DeleteFunctionSecretData, DeleteFunctionSecretError, DeleteFunctionSecretErrors, DeleteFunctionSecretResponse, DeleteFunctionSecretResponses, DeleteMemoryData, DeleteMemoryError, DeleteMemoryErrors, DeleteMemoryResponse, DeleteMemoryResponses, DeleteMemoryResult, DeleteOrgSecretData, DeleteOrgSecretError, DeleteOrgSecretErrors, DeleteOrgSecretResponse, DeleteOrgSecretResponses, DeleteRegistryData, DeleteRegistryError, DeleteRegistryErrors, DeleteRegistryResponse, DeleteRegistryResponses, DeleteRouteData, DeleteRouteError, DeleteRouteErrors, DeleteRouteResponse, DeleteRouteResponses, DeleteWakeAuthorizationData, DeleteWakeAuthorizationError, DeleteWakeAuthorizationErrors, DeleteWakeAuthorizationResponse, DeleteWakeAuthorizationResponses, DeleteWakeScheduleData, DeleteWakeScheduleError, DeleteWakeScheduleErrors, DeleteWakeScheduleResponse, DeleteWakeScheduleResponses, DeliveryStatus, DeliverySummary, DiscardContentResult, DiscardEmailContentData, DiscardEmailContentError, DiscardEmailContentErrors, DiscardEmailContentResponse, DiscardEmailContentResponses, DkimSignature, Domain, DomainDnsRecord, DomainVerifyResult, DownloadAttachmentsData, DownloadAttachmentsError, DownloadAttachmentsErrors, DownloadAttachmentsResponse, DownloadAttachmentsResponses, DownloadDomainZoneFileData, DownloadDomainZoneFileError, DownloadDomainZoneFileErrors, DownloadDomainZoneFileResponse, DownloadDomainZoneFileResponses, DownloadRawEmailData, DownloadRawEmailError, DownloadRawEmailErrors, DownloadRawEmailResponse, DownloadRawEmailResponses, EmailAddress, EmailAttachment, EmailAuth, EmailDetail, EmailDetailReply, EmailSearchFacetBucket, EmailSearchFacets, EmailSearchHighlights, EmailSearchMeta, EmailSearchResult, EmailStatus, EmailSummary, EmailWebhookStatus, Endpoint, ErrorResponse, Filter, FunctionDeployStatus, FunctionDetail, FunctionListItem, FunctionLogRow, FunctionRouteBody, FunctionRouteResult, FunctionRouting, FunctionSecretListItem, FunctionSecretWriteResult, FunctionTestRun, FunctionTestRunDelivery, FunctionTestRunDeliveryEndpoint, FunctionTestRunInboundEmail, FunctionTestRunOutboundRequest, FunctionTestRunReply, FunctionTestRunSend, FunctionTestRunState, FunctionTestRunTrace, GateDenial, GateFix, GetAccountData, GetAccountError, GetAccountErrors, GetAccountResponse, GetAccountResponses, GetAgentData, GetAgentError, GetAgentErrors, GetAgentResponse, GetAgentResponses, GetChallengeData, GetChallengeError, GetChallengeErrors, GetChallengeResponse, GetChallengeResponses, GetConversationData, GetConversationError, GetConversationErrors, GetConversationResponse, GetConversationResponses, GetEmailData, GetEmailError, GetEmailErrors, GetEmailResponse, GetEmailResponses, GetFunctionData, GetFunctionError, GetFunctionErrors, GetFunctionResponse, GetFunctionResponses, GetFunctionRoutingData, GetFunctionRoutingError, GetFunctionRoutingErrors, GetFunctionRoutingResponse, GetFunctionRoutingResponses, GetFunctionTestRunTraceData, GetFunctionTestRunTraceError, GetFunctionTestRunTraceErrors, GetFunctionTestRunTraceResponse, GetFunctionTestRunTraceResponses, GetInboxStatusData, GetInboxStatusError, GetInboxStatusErrors, GetInboxStatusResponse, GetInboxStatusResponses, GetMemoryData, GetMemoryError, GetMemoryErrors, GetMemoryResponse, GetMemoryResponses, GetOrgRoutingTopologyData, GetOrgRoutingTopologyError, GetOrgRoutingTopologyErrors, GetOrgRoutingTopologyResponse, GetOrgRoutingTopologyResponses, GetRegistryData, GetRegistryError, GetRegistryErrors, GetRegistryResponse, GetRegistryResponses, GetSendPermissionsData, GetSendPermissionsError, GetSendPermissionsErrors, GetSendPermissionsResponse, GetSendPermissionsResponses, GetSentEmailData, GetSentEmailError, GetSentEmailErrors, GetSentEmailResponse, GetSentEmailResponses, GetSpendPolicyData, GetSpendPolicyError, GetSpendPolicyErrors, GetSpendPolicyResponse, GetSpendPolicyResponses, GetStorageStatsData, GetStorageStatsError, GetStorageStatsErrors, GetStorageStatsResponse, GetStorageStatsResponses, GetThreadData, GetThreadError, GetThreadErrors, GetThreadResponse, GetThreadResponses, GetWakeScheduleData, GetWakeScheduleError, GetWakeScheduleErrors, GetWakeScheduleResponse, GetWakeScheduleResponses, GetWebhookSecretData, GetWebhookSecretError, GetWebhookSecretErrors, GetWebhookSecretResponse, GetWebhookSecretResponses, IdempotencyKey, InboxStatus, InboxStatusDomain, InboxStatusEndpointSummary, InboxStatusFunctionSummary, InboxStatusNextAction, InboxStatusRecentEmailSummary, Limit, ListDeclinedPaymentsData, ListDeclinedPaymentsError, ListDeclinedPaymentsErrors, ListDeclinedPaymentsResponse, ListDeclinedPaymentsResponses, ListDeliveriesData, ListDeliveriesError, ListDeliveriesErrors, ListDeliveriesResponse, ListDeliveriesResponses, ListDomainsData, ListDomainsError, ListDomainsErrors, ListDomainsResponse, ListDomainsResponses, ListEmailsData, ListEmailsError, ListEmailsErrors, ListEmailsResponse, ListEmailsResponses, ListEndpointsData, ListEndpointsError, ListEndpointsErrors, ListEndpointsResponse, ListEndpointsResponses, ListEnvelope, ListFiltersData, ListFiltersError, ListFiltersErrors, ListFiltersResponse, ListFiltersResponses, ListFunctionLogsData, ListFunctionLogsError, ListFunctionLogsErrors, ListFunctionLogsResponse, ListFunctionLogsResponses, ListFunctionsData, ListFunctionSecretsData, ListFunctionSecretsError, ListFunctionSecretsErrors, ListFunctionSecretsResponse, ListFunctionSecretsResponses, ListFunctionsError, ListFunctionsErrors, ListFunctionsResponse, ListFunctionsResponses, ListOrgSecretsData, ListOrgSecretsError, ListOrgSecretsErrors, ListOrgSecretsResponse, ListOrgSecretsResponses, ListPayoutAddressesData, ListPayoutAddressesError, ListPayoutAddressesErrors, ListPayoutAddressesResponse, ListPayoutAddressesResponses, ListRegistriesData, ListRegistriesError, ListRegistriesErrors, ListRegistriesResponse, ListRegistriesResponses, ListRegistryAgentsData, ListRegistryAgentsResponse, ListRegistryAgentsResponses, ListRegistryRequestsData, ListRegistryRequestsError, ListRegistryRequestsErrors, ListRegistryRequestsResponse, ListRegistryRequestsResponses, ListRoutesData, ListRoutesError, ListRoutesErrors, ListRoutesResponse, ListRoutesResponses, ListSentEmailsData, ListSentEmailsError, ListSentEmailsErrors, ListSentEmailsResponse, ListSentEmailsResponses, ListWakeAuthorizationsData, ListWakeAuthorizationsError, ListWakeAuthorizationsErrors, ListWakeAuthorizationsResponse, ListWakeAuthorizationsResponses, ListWakeDispatchesData, ListWakeDispatchesError, ListWakeDispatchesErrors, ListWakeDispatchesResponse, ListWakeDispatchesResponses, ListWakeSchedulesData, ListWakeSchedulesError, ListWakeSchedulesErrors, ListWakeSchedulesResponse, ListWakeSchedulesResponses, MemoryJsonValue, MemoryKeyQuery, MemoryRecord, MemoryRecordWithValue, MemoryResolvedScope, MemoryScope, MemoryScopeId, MemoryScopeQueryType, NumericString, OrgSecretListItem, OrgSecretWriteResult, PaginationMeta, ParsedEmailData, PayChallengeData, PayChallengeError, PayChallengeErrors, PayChallengeInput, PayChallengeResponse, PayChallengeResponses, PlanLimits, PollCliLoginData, PollCliLoginError, PollCliLoginErrors, PollCliLoginInput, PollCliLoginResponse, PollCliLoginResponses, PublishAgentData, PublishAgentError, PublishAgentErrors, PublishAgentInput, PublishAgentResponse, PublishAgentResponses, PublishAgentResult, PublishPolicy, RecipientRoute, RegisterPayoutAddressData, RegisterPayoutAddressError, RegisterPayoutAddressErrors, RegisterPayoutAddressInput, RegisterPayoutAddressResponse, RegisterPayoutAddressResponses, Registry, RegistryAgent, RegistryRequest, ReorderRoutesData, ReorderRoutesError, ReorderRoutesErrors, ReorderRoutesInput, ReorderRoutesResponse, ReorderRoutesResponses, ReplayDeliveryData, ReplayDeliveryError, ReplayDeliveryErrors, ReplayDeliveryResponse, ReplayDeliveryResponses, ReplayEmailWebhooksData, ReplayEmailWebhooksError, ReplayEmailWebhooksErrors, ReplayEmailWebhooksResponse, ReplayEmailWebhooksResponses, ReplayResult, ReplyInput, ReplyToEmailData, ReplyToEmailError, ReplyToEmailErrors, ReplyToEmailResponse, ReplyToEmailResponses, ResendAgentSignupVerificationData, ResendAgentSignupVerificationError, ResendAgentSignupVerificationErrors, ResendAgentSignupVerificationInput, ResendAgentSignupVerificationResponse, ResendAgentSignupVerificationResponses, ResendCliSignupVerificationData, ResendCliSignupVerificationError, ResendCliSignupVerificationErrors, ResendCliSignupVerificationInput, ResendCliSignupVerificationResponse, ResendCliSignupVerificationResponses, ResolveRegistryHandleData, ResolveRegistryHandleError, ResolveRegistryHandleErrors, ResolveRegistryHandleResponse, ResolveRegistryHandleResponses, ResourceId, RotateWebhookSecretData, RotateWebhookSecretError, RotateWebhookSecretErrors, RotateWebhookSecretResponse, RotateWebhookSecretResponses, RouteEvaluatedEntry, RoutingTopology, RunWakeScheduleData, RunWakeScheduleError, RunWakeScheduleErrors, RunWakeScheduleResponse, RunWakeScheduleResponses, SearchEmailsData, SearchEmailsError, SearchEmailsErrors, SearchEmailsResponse, SearchEmailsResponses, SearchMemoriesData, SearchMemoriesError, SearchMemoriesErrors, SearchMemoriesResponse, SearchMemoriesResponses, SemanticSearchCoverage, SemanticSearchData, SemanticSearchError, SemanticSearchErrors, SemanticSearchField, SemanticSearchInput, SemanticSearchMeta, SemanticSearchResponse, SemanticSearchResponses, SemanticSearchResult, SemanticSearchScoreBreakdown, SemanticSearchSnippet, SendEmailData, SendEmailError, SendEmailErrors, SendEmailResponse, SendEmailResponses, SendMailAttachment, SendMailInput, SendMailResult, SendPermissionAddress, SendPermissionAnyRecipient, SendPermissionManagedZone, SendPermissionRule, SendPermissionsMeta, SendPermissionYourDomain, SentEmailDetail, SentEmailStatus, SentEmailSummary, SetFunctionRouteData, SetFunctionRouteError, SetFunctionRouteErrors, SetFunctionRouteResponse, SetFunctionRouteResponses, SetFunctionSecretData, SetFunctionSecretError, SetFunctionSecretErrors, SetFunctionSecretInput, SetFunctionSecretResponse, SetFunctionSecretResponses, SetMemoryData, SetMemoryError, SetMemoryErrors, SetMemoryInput, SetMemoryResponse, SetMemoryResponses, SetOrgSecretData, SetOrgSecretError, SetOrgSecretErrors, SetOrgSecretInput, SetOrgSecretResponse, SetOrgSecretResponses, SimulateRouteData, SimulateRouteError, SimulateRouteErrors, SimulateRouteInput, SimulateRouteResponse, SimulateRouteResponses, SimulateRouteResult, StartAgentClaimData, StartAgentClaimError, StartAgentClaimErrors, StartAgentClaimInput, StartAgentClaimResponse, StartAgentClaimResponses, StartAgentSignupData, StartAgentSignupError, StartAgentSignupErrors, StartAgentSignupInput, StartAgentSignupResponse, StartAgentSignupResponses, StartCliLoginData, StartCliLoginError, StartCliLoginErrors, StartCliLoginInput, StartCliLoginResponse, StartCliLoginResponses, StartCliSignupData, StartCliSignupError, StartCliSignupErrors, StartCliSignupInput, StartCliSignupResponse, StartCliSignupResponses, StorageStats, SuccessEnvelope, TestEndpointData, TestEndpointError, TestEndpointErrors, TestEndpointResponse, TestEndpointResponses, TestFunctionData, TestFunctionError, TestFunctionErrors, TestFunctionResponse, TestFunctionResponses, TestInvocationResult, TestResult, Thread, ThreadMessage, UnpublishAgentData, UnpublishAgentError, UnpublishAgentErrors, UnpublishAgentResponse, UnpublishAgentResponses, UnsetFunctionRouteData, UnsetFunctionRouteError, UnsetFunctionRouteErrors, UnsetFunctionRouteResponse, UnsetFunctionRouteResponses, UnverifiedDomain, UpdateAccountData, UpdateAccountError, UpdateAccountErrors, UpdateAccountInput, UpdateAccountResponse, UpdateAccountResponses, UpdateDomainData, UpdateDomainError, UpdateDomainErrors, UpdateDomainInput, UpdateDomainResponse, UpdateDomainResponses, UpdateEndpointData, UpdateEndpointError, UpdateEndpointErrors, UpdateEndpointInput, UpdateEndpointResponse, UpdateEndpointResponses, UpdateFilterData, UpdateFilterError, UpdateFilterErrors, UpdateFilterInput, UpdateFilterResponse, UpdateFilterResponses, UpdateFunctionData, UpdateFunctionError, UpdateFunctionErrors, UpdateFunctionInput, UpdateFunctionResponse, UpdateFunctionResponses, UpdateRegistryData, UpdateRegistryError, UpdateRegistryErrors, UpdateRegistryInput, UpdateRegistryResponse, UpdateRegistryResponses, UpdateRouteData, UpdateRouteError, UpdateRouteErrors, UpdateRouteInput, UpdateRouteResponse, UpdateRouteResponses, UpdateSpendPolicyData, UpdateSpendPolicyError, UpdateSpendPolicyErrors, UpdateSpendPolicyInput, UpdateSpendPolicyResponse, UpdateSpendPolicyResponses, UpdateWakeAuthorizationData, UpdateWakeAuthorizationError, UpdateWakeAuthorizationErrors, UpdateWakeAuthorizationInput, UpdateWakeAuthorizationResponse, UpdateWakeAuthorizationResponses, UpdateWakeScheduleData, UpdateWakeScheduleError, UpdateWakeScheduleErrors, UpdateWakeScheduleInput, UpdateWakeScheduleResponse, UpdateWakeScheduleResponses, VerifiedDomain, VerifyAgentClaimData, VerifyAgentClaimError, VerifyAgentClaimErrors, VerifyAgentClaimInput, VerifyAgentClaimResponse, VerifyAgentClaimResponses, VerifyAgentSignupData, VerifyAgentSignupError, VerifyAgentSignupErrors, VerifyAgentSignupInput, VerifyAgentSignupResponse, VerifyAgentSignupResponses, VerifyCliSignupData, VerifyCliSignupError, VerifyCliSignupErrors, VerifyCliSignupInput, VerifyCliSignupResponse, VerifyCliSignupResponses, VerifyDomainData, VerifyDomainError, VerifyDomainErrors, VerifyDomainResponse, VerifyDomainResponses, WakeAuthorization, WakeDispatch, WakeSchedule, WebhookSecret, X402Challenge, X402DeclinedPayment, X402EmailChallenge, X402EmailChallengeDetails, X402NonceBinding, X402PaymentPayload, X402PaymentRequirements, X402PayoutAddress, X402Receipt, X402SpendPolicy } from './types.gen.js'; +export { addDomain, cliLogout, createAgentAccount, createAgentClaimLink, createChallenge, createEmailChallenge, createEndpoint, createFilter, createFunction, createFunctionSecret, createOrgSecret, createRegistry, createRoute, createWakeAuthorization, createWakeSchedule, decideRegistryRequest, defineAgent, deleteDomain, deleteEmail, deleteEndpoint, deleteFilter, deleteFunction, deleteFunctionSecret, deleteMemory, deleteOrgSecret, deleteRegistry, deleteRoute, deleteWakeAuthorization, deleteWakeSchedule, discardEmailContent, downloadAttachments, downloadDomainZoneFile, downloadRawEmail, getAccount, getAgent, getChallenge, getConversation, getEmail, getFunction, getFunctionRouting, getFunctionTestRunTrace, getInboxStatus, getMemory, getOrgRoutingTopology, getRegistry, getSendPermissions, getSentEmail, getSpendPolicy, getStorageStats, getTemplate, getTemplateInstall, getThread, getWakeSchedule, getWebhookSecret, installTemplate, listDeclinedPayments, listDeliveries, listDomains, listEmails, listEndpoints, listFilters, listFunctionLogs, listFunctions, listFunctionSecrets, listOrgSecrets, listPayoutAddresses, listRegistries, listRegistryAgents, listRegistryRequests, listRoutes, listSentEmails, listTemplates, listWakeAuthorizations, listWakeDispatches, listWakeSchedules, type Options, payChallenge, pollCliLogin, publishAgent, registerPayoutAddress, reorderRoutes, replayDelivery, replayEmailWebhooks, replyToEmail, resendAgentSignupVerification, resendCliSignupVerification, resolveRegistryHandle, rotateWebhookSecret, runWakeSchedule, searchEmails, searchMemories, semanticSearch, sendEmail, setFunctionRoute, setFunctionSecret, setMemory, setOrgSecret, simulateRoute, startAgentClaim, startAgentSignup, startCliLogin, startCliSignup, testEndpoint, testFunction, unpublishAgent, unsetFunctionRoute, updateAccount, updateDomain, updateEndpoint, updateFilter, updateFunction, updateRegistry, updateRoute, updateSpendPolicy, updateWakeAuthorization, updateWakeSchedule, verifyAgentClaim, verifyAgentSignup, verifyCliSignup, verifyDomain } from './sdk.gen.js'; +export type { Account, AccountUpdated, AddDomainData, AddDomainError, AddDomainErrors, AddDomainInput, AddDomainResponse, AddDomainResponses, AgentAccountResult, AgentAccountUpgradeHint, AgentClaimLinkResult, AgentClaimResult, AgentClaimStartResult, AgentOrgRef, AgentSignupResendResult, AgentSignupStartResult, AgentSignupVerifyResult, ClientOptions, CliLoginPollResult, CliLoginStartResult, CliLogoutData, CliLogoutError, CliLogoutErrors, CliLogoutInput, CliLogoutResponse, CliLogoutResponses, CliLogoutResult, CliSignupResendResult, CliSignupStartResult, CliSignupVerifyResult, Conversation, ConversationMessage, CreateAgentAccountData, CreateAgentAccountError, CreateAgentAccountErrors, CreateAgentAccountInput, CreateAgentAccountResponse, CreateAgentAccountResponses, CreateAgentClaimLinkData, CreateAgentClaimLinkError, CreateAgentClaimLinkErrors, CreateAgentClaimLinkInput, CreateAgentClaimLinkResponse, CreateAgentClaimLinkResponses, CreateChallengeData, CreateChallengeError, CreateChallengeErrors, CreateChallengeInput, CreateChallengeResponse, CreateChallengeResponses, CreateEmailChallengeData, CreateEmailChallengeError, CreateEmailChallengeErrors, CreateEmailChallengeInput, CreateEmailChallengeResponse, CreateEmailChallengeResponses, CreateEndpointData, CreateEndpointError, CreateEndpointErrors, CreateEndpointInput, CreateEndpointResponse, CreateEndpointResponses, CreateFilterData, CreateFilterError, CreateFilterErrors, CreateFilterInput, CreateFilterResponse, CreateFilterResponses, CreateFunctionData, CreateFunctionError, CreateFunctionErrors, CreateFunctionInput, CreateFunctionResponse, CreateFunctionResponses, CreateFunctionResult, CreateFunctionSecretData, CreateFunctionSecretError, CreateFunctionSecretErrors, CreateFunctionSecretInput, CreateFunctionSecretResponse, CreateFunctionSecretResponses, CreateOrgSecretData, CreateOrgSecretError, CreateOrgSecretErrors, CreateOrgSecretInput, CreateOrgSecretResponse, CreateOrgSecretResponses, CreateRegistryData, CreateRegistryError, CreateRegistryErrors, CreateRegistryInput, CreateRegistryResponse, CreateRegistryResponses, CreateRouteData, CreateRouteError, CreateRouteErrors, CreateRouteInput, CreateRouteResponse, CreateRouteResponses, CreateWakeAuthorizationData, CreateWakeAuthorizationError, CreateWakeAuthorizationErrors, CreateWakeAuthorizationInput, CreateWakeAuthorizationResponse, CreateWakeAuthorizationResponses, CreateWakeScheduleData, CreateWakeScheduleError, CreateWakeScheduleErrors, CreateWakeScheduleInput, CreateWakeScheduleResponse, CreateWakeScheduleResponses, Cursor, DecideRegistryRequestData, DecideRegistryRequestError, DecideRegistryRequestErrors, DecideRegistryRequestInput, DecideRegistryRequestResponse, DecideRegistryRequestResponses, DefineAgentData, DefineAgentError, DefineAgentErrors, DefineAgentInput, DefineAgentResponse, DefineAgentResponses, DeleteDomainData, DeleteDomainError, DeleteDomainErrors, DeleteDomainResponse, DeleteDomainResponses, DeleteEmailData, DeleteEmailError, DeleteEmailErrors, DeleteEmailResponse, DeleteEmailResponses, DeleteEndpointData, DeleteEndpointError, DeleteEndpointErrors, DeleteEndpointResponse, DeleteEndpointResponses, DeleteFilterData, DeleteFilterError, DeleteFilterErrors, DeleteFilterResponse, DeleteFilterResponses, DeleteFunctionData, DeleteFunctionError, DeleteFunctionErrors, DeleteFunctionResponse, DeleteFunctionResponses, DeleteFunctionSecretData, DeleteFunctionSecretError, DeleteFunctionSecretErrors, DeleteFunctionSecretResponse, DeleteFunctionSecretResponses, DeleteMemoryData, DeleteMemoryError, DeleteMemoryErrors, DeleteMemoryResponse, DeleteMemoryResponses, DeleteMemoryResult, DeleteOrgSecretData, DeleteOrgSecretError, DeleteOrgSecretErrors, DeleteOrgSecretResponse, DeleteOrgSecretResponses, DeleteRegistryData, DeleteRegistryError, DeleteRegistryErrors, DeleteRegistryResponse, DeleteRegistryResponses, DeleteRouteData, DeleteRouteError, DeleteRouteErrors, DeleteRouteResponse, DeleteRouteResponses, DeleteWakeAuthorizationData, DeleteWakeAuthorizationError, DeleteWakeAuthorizationErrors, DeleteWakeAuthorizationResponse, DeleteWakeAuthorizationResponses, DeleteWakeScheduleData, DeleteWakeScheduleError, DeleteWakeScheduleErrors, DeleteWakeScheduleResponse, DeleteWakeScheduleResponses, DeliveryStatus, DeliverySummary, DiscardContentResult, DiscardEmailContentData, DiscardEmailContentError, DiscardEmailContentErrors, DiscardEmailContentResponse, DiscardEmailContentResponses, DkimSignature, Domain, DomainDnsRecord, DomainVerifyResult, DownloadAttachmentsData, DownloadAttachmentsError, DownloadAttachmentsErrors, DownloadAttachmentsResponse, DownloadAttachmentsResponses, DownloadDomainZoneFileData, DownloadDomainZoneFileError, DownloadDomainZoneFileErrors, DownloadDomainZoneFileResponse, DownloadDomainZoneFileResponses, DownloadRawEmailData, DownloadRawEmailError, DownloadRawEmailErrors, DownloadRawEmailResponse, DownloadRawEmailResponses, EmailAddress, EmailAttachment, EmailAuth, EmailDetail, EmailDetailReply, EmailSearchFacetBucket, EmailSearchFacets, EmailSearchHighlights, EmailSearchMeta, EmailSearchResult, EmailStatus, EmailSummary, EmailWebhookStatus, Endpoint, ErrorResponse, Filter, FunctionDeployStatus, FunctionDetail, FunctionListItem, FunctionLogRow, FunctionRouteBody, FunctionRouteResult, FunctionRouting, FunctionSecretListItem, FunctionSecretWriteResult, FunctionTestRun, FunctionTestRunDelivery, FunctionTestRunDeliveryEndpoint, FunctionTestRunInboundEmail, FunctionTestRunOutboundRequest, FunctionTestRunReply, FunctionTestRunSend, FunctionTestRunState, FunctionTestRunTrace, GateDenial, GateFix, GetAccountData, GetAccountError, GetAccountErrors, GetAccountResponse, GetAccountResponses, GetAgentData, GetAgentError, GetAgentErrors, GetAgentResponse, GetAgentResponses, GetChallengeData, GetChallengeError, GetChallengeErrors, GetChallengeResponse, GetChallengeResponses, GetConversationData, GetConversationError, GetConversationErrors, GetConversationResponse, GetConversationResponses, GetEmailData, GetEmailError, GetEmailErrors, GetEmailResponse, GetEmailResponses, GetFunctionData, GetFunctionError, GetFunctionErrors, GetFunctionResponse, GetFunctionResponses, GetFunctionRoutingData, GetFunctionRoutingError, GetFunctionRoutingErrors, GetFunctionRoutingResponse, GetFunctionRoutingResponses, GetFunctionTestRunTraceData, GetFunctionTestRunTraceError, GetFunctionTestRunTraceErrors, GetFunctionTestRunTraceResponse, GetFunctionTestRunTraceResponses, GetInboxStatusData, GetInboxStatusError, GetInboxStatusErrors, GetInboxStatusResponse, GetInboxStatusResponses, GetMemoryData, GetMemoryError, GetMemoryErrors, GetMemoryResponse, GetMemoryResponses, GetOrgRoutingTopologyData, GetOrgRoutingTopologyError, GetOrgRoutingTopologyErrors, GetOrgRoutingTopologyResponse, GetOrgRoutingTopologyResponses, GetRegistryData, GetRegistryError, GetRegistryErrors, GetRegistryResponse, GetRegistryResponses, GetSendPermissionsData, GetSendPermissionsError, GetSendPermissionsErrors, GetSendPermissionsResponse, GetSendPermissionsResponses, GetSentEmailData, GetSentEmailError, GetSentEmailErrors, GetSentEmailResponse, GetSentEmailResponses, GetSpendPolicyData, GetSpendPolicyError, GetSpendPolicyErrors, GetSpendPolicyResponse, GetSpendPolicyResponses, GetStorageStatsData, GetStorageStatsError, GetStorageStatsErrors, GetStorageStatsResponse, GetStorageStatsResponses, GetTemplateData, GetTemplateError, GetTemplateErrors, GetTemplateInstallData, GetTemplateInstallError, GetTemplateInstallErrors, GetTemplateInstallResponse, GetTemplateInstallResponses, GetTemplateResponse, GetTemplateResponses, GetThreadData, GetThreadError, GetThreadErrors, GetThreadResponse, GetThreadResponses, GetWakeScheduleData, GetWakeScheduleError, GetWakeScheduleErrors, GetWakeScheduleResponse, GetWakeScheduleResponses, GetWebhookSecretData, GetWebhookSecretError, GetWebhookSecretErrors, GetWebhookSecretResponse, GetWebhookSecretResponses, IdempotencyKey, InboxStatus, InboxStatusDomain, InboxStatusEndpointSummary, InboxStatusFunctionSummary, InboxStatusNextAction, InboxStatusRecentEmailSummary, InstallTemplateBody, InstallTemplateData, InstallTemplateError, InstallTemplateErrors, InstallTemplateResponse, InstallTemplateResponses, Limit, ListDeclinedPaymentsData, ListDeclinedPaymentsError, ListDeclinedPaymentsErrors, ListDeclinedPaymentsResponse, ListDeclinedPaymentsResponses, ListDeliveriesData, ListDeliveriesError, ListDeliveriesErrors, ListDeliveriesResponse, ListDeliveriesResponses, ListDomainsData, ListDomainsError, ListDomainsErrors, ListDomainsResponse, ListDomainsResponses, ListEmailsData, ListEmailsError, ListEmailsErrors, ListEmailsResponse, ListEmailsResponses, ListEndpointsData, ListEndpointsError, ListEndpointsErrors, ListEndpointsResponse, ListEndpointsResponses, ListEnvelope, ListFiltersData, ListFiltersError, ListFiltersErrors, ListFiltersResponse, ListFiltersResponses, ListFunctionLogsData, ListFunctionLogsError, ListFunctionLogsErrors, ListFunctionLogsResponse, ListFunctionLogsResponses, ListFunctionsData, ListFunctionSecretsData, ListFunctionSecretsError, ListFunctionSecretsErrors, ListFunctionSecretsResponse, ListFunctionSecretsResponses, ListFunctionsError, ListFunctionsErrors, ListFunctionsResponse, ListFunctionsResponses, ListOrgSecretsData, ListOrgSecretsError, ListOrgSecretsErrors, ListOrgSecretsResponse, ListOrgSecretsResponses, ListPayoutAddressesData, ListPayoutAddressesError, ListPayoutAddressesErrors, ListPayoutAddressesResponse, ListPayoutAddressesResponses, ListRegistriesData, ListRegistriesError, ListRegistriesErrors, ListRegistriesResponse, ListRegistriesResponses, ListRegistryAgentsData, ListRegistryAgentsResponse, ListRegistryAgentsResponses, ListRegistryRequestsData, ListRegistryRequestsError, ListRegistryRequestsErrors, ListRegistryRequestsResponse, ListRegistryRequestsResponses, ListRoutesData, ListRoutesError, ListRoutesErrors, ListRoutesResponse, ListRoutesResponses, ListSentEmailsData, ListSentEmailsError, ListSentEmailsErrors, ListSentEmailsResponse, ListSentEmailsResponses, ListTemplatesData, ListTemplatesError, ListTemplatesErrors, ListTemplatesResponse, ListTemplatesResponses, ListWakeAuthorizationsData, ListWakeAuthorizationsError, ListWakeAuthorizationsErrors, ListWakeAuthorizationsResponse, ListWakeAuthorizationsResponses, ListWakeDispatchesData, ListWakeDispatchesError, ListWakeDispatchesErrors, ListWakeDispatchesResponse, ListWakeDispatchesResponses, ListWakeSchedulesData, ListWakeSchedulesError, ListWakeSchedulesErrors, ListWakeSchedulesResponse, ListWakeSchedulesResponses, MemoryJsonValue, MemoryKeyQuery, MemoryRecord, MemoryRecordWithValue, MemoryResolvedScope, MemoryScope, MemoryScopeId, MemoryScopeQueryType, NumericString, OrgSecretListItem, OrgSecretWriteResult, PaginationMeta, ParsedEmailData, PayChallengeData, PayChallengeError, PayChallengeErrors, PayChallengeInput, PayChallengeResponse, PayChallengeResponses, PlanLimits, PollCliLoginData, PollCliLoginError, PollCliLoginErrors, PollCliLoginInput, PollCliLoginResponse, PollCliLoginResponses, PublishAgentData, PublishAgentError, PublishAgentErrors, PublishAgentInput, PublishAgentResponse, PublishAgentResponses, PublishAgentResult, PublishPolicy, RecipientRoute, RegisterPayoutAddressData, RegisterPayoutAddressError, RegisterPayoutAddressErrors, RegisterPayoutAddressInput, RegisterPayoutAddressResponse, RegisterPayoutAddressResponses, Registry, RegistryAgent, RegistryRequest, ReorderRoutesData, ReorderRoutesError, ReorderRoutesErrors, ReorderRoutesInput, ReorderRoutesResponse, ReorderRoutesResponses, ReplayDeliveryData, ReplayDeliveryError, ReplayDeliveryErrors, ReplayDeliveryResponse, ReplayDeliveryResponses, ReplayEmailWebhooksData, ReplayEmailWebhooksError, ReplayEmailWebhooksErrors, ReplayEmailWebhooksResponse, ReplayEmailWebhooksResponses, ReplayResult, ReplyInput, ReplyToEmailData, ReplyToEmailError, ReplyToEmailErrors, ReplyToEmailResponse, ReplyToEmailResponses, ResendAgentSignupVerificationData, ResendAgentSignupVerificationError, ResendAgentSignupVerificationErrors, ResendAgentSignupVerificationInput, ResendAgentSignupVerificationResponse, ResendAgentSignupVerificationResponses, ResendCliSignupVerificationData, ResendCliSignupVerificationError, ResendCliSignupVerificationErrors, ResendCliSignupVerificationInput, ResendCliSignupVerificationResponse, ResendCliSignupVerificationResponses, ResolveRegistryHandleData, ResolveRegistryHandleError, ResolveRegistryHandleErrors, ResolveRegistryHandleResponse, ResolveRegistryHandleResponses, ResourceId, RotateWebhookSecretData, RotateWebhookSecretError, RotateWebhookSecretErrors, RotateWebhookSecretResponse, RotateWebhookSecretResponses, RouteEvaluatedEntry, RoutingTopology, RunWakeScheduleData, RunWakeScheduleError, RunWakeScheduleErrors, RunWakeScheduleResponse, RunWakeScheduleResponses, SearchEmailsData, SearchEmailsError, SearchEmailsErrors, SearchEmailsResponse, SearchEmailsResponses, SearchMemoriesData, SearchMemoriesError, SearchMemoriesErrors, SearchMemoriesResponse, SearchMemoriesResponses, SemanticSearchCoverage, SemanticSearchData, SemanticSearchError, SemanticSearchErrors, SemanticSearchField, SemanticSearchInput, SemanticSearchMeta, SemanticSearchResponse, SemanticSearchResponses, SemanticSearchResult, SemanticSearchScoreBreakdown, SemanticSearchSnippet, SendEmailData, SendEmailError, SendEmailErrors, SendEmailResponse, SendEmailResponses, SendMailAttachment, SendMailInput, SendMailResult, SendPermissionAddress, SendPermissionAnyRecipient, SendPermissionManagedZone, SendPermissionRule, SendPermissionsMeta, SendPermissionYourDomain, SentEmailDetail, SentEmailStatus, SentEmailSummary, SetFunctionRouteData, SetFunctionRouteError, SetFunctionRouteErrors, SetFunctionRouteResponse, SetFunctionRouteResponses, SetFunctionSecretData, SetFunctionSecretError, SetFunctionSecretErrors, SetFunctionSecretInput, SetFunctionSecretResponse, SetFunctionSecretResponses, SetMemoryData, SetMemoryError, SetMemoryErrors, SetMemoryInput, SetMemoryResponse, SetMemoryResponses, SetOrgSecretData, SetOrgSecretError, SetOrgSecretErrors, SetOrgSecretInput, SetOrgSecretResponse, SetOrgSecretResponses, SimulateRouteData, SimulateRouteError, SimulateRouteErrors, SimulateRouteInput, SimulateRouteResponse, SimulateRouteResponses, SimulateRouteResult, StartAgentClaimData, StartAgentClaimError, StartAgentClaimErrors, StartAgentClaimInput, StartAgentClaimResponse, StartAgentClaimResponses, StartAgentSignupData, StartAgentSignupError, StartAgentSignupErrors, StartAgentSignupInput, StartAgentSignupResponse, StartAgentSignupResponses, StartCliLoginData, StartCliLoginError, StartCliLoginErrors, StartCliLoginInput, StartCliLoginResponse, StartCliLoginResponses, StartCliSignupData, StartCliSignupError, StartCliSignupErrors, StartCliSignupInput, StartCliSignupResponse, StartCliSignupResponses, StorageStats, SuccessEnvelope, TemplateAuthor, TemplateInstall, TemplateInstallState, TemplateInstallStatus, TemplateManifest, TemplateRegistryDetail, TemplateRegistryPage, TemplateRegistryStatus, TemplateRegistrySummary, TemplateSecret, TemplateSecretGroup, TemplateSetup, TemplateSource, TemplateVariable, TemplateVariableValidation, TestEndpointData, TestEndpointError, TestEndpointErrors, TestEndpointResponse, TestEndpointResponses, TestFunctionData, TestFunctionError, TestFunctionErrors, TestFunctionResponse, TestFunctionResponses, TestInvocationResult, TestResult, Thread, ThreadMessage, UnpublishAgentData, UnpublishAgentError, UnpublishAgentErrors, UnpublishAgentResponse, UnpublishAgentResponses, UnsetFunctionRouteData, UnsetFunctionRouteError, UnsetFunctionRouteErrors, UnsetFunctionRouteResponse, UnsetFunctionRouteResponses, UnverifiedDomain, UpdateAccountData, UpdateAccountError, UpdateAccountErrors, UpdateAccountInput, UpdateAccountResponse, UpdateAccountResponses, UpdateDomainData, UpdateDomainError, UpdateDomainErrors, UpdateDomainInput, UpdateDomainResponse, UpdateDomainResponses, UpdateEndpointData, UpdateEndpointError, UpdateEndpointErrors, UpdateEndpointInput, UpdateEndpointResponse, UpdateEndpointResponses, UpdateFilterData, UpdateFilterError, UpdateFilterErrors, UpdateFilterInput, UpdateFilterResponse, UpdateFilterResponses, UpdateFunctionData, UpdateFunctionError, UpdateFunctionErrors, UpdateFunctionInput, UpdateFunctionResponse, UpdateFunctionResponses, UpdateRegistryData, UpdateRegistryError, UpdateRegistryErrors, UpdateRegistryInput, UpdateRegistryResponse, UpdateRegistryResponses, UpdateRouteData, UpdateRouteError, UpdateRouteErrors, UpdateRouteInput, UpdateRouteResponse, UpdateRouteResponses, UpdateSpendPolicyData, UpdateSpendPolicyError, UpdateSpendPolicyErrors, UpdateSpendPolicyInput, UpdateSpendPolicyResponse, UpdateSpendPolicyResponses, UpdateWakeAuthorizationData, UpdateWakeAuthorizationError, UpdateWakeAuthorizationErrors, UpdateWakeAuthorizationInput, UpdateWakeAuthorizationResponse, UpdateWakeAuthorizationResponses, UpdateWakeScheduleData, UpdateWakeScheduleError, UpdateWakeScheduleErrors, UpdateWakeScheduleInput, UpdateWakeScheduleResponse, UpdateWakeScheduleResponses, VerifiedDomain, VerifyAgentClaimData, VerifyAgentClaimError, VerifyAgentClaimErrors, VerifyAgentClaimInput, VerifyAgentClaimResponse, VerifyAgentClaimResponses, VerifyAgentSignupData, VerifyAgentSignupError, VerifyAgentSignupErrors, VerifyAgentSignupInput, VerifyAgentSignupResponse, VerifyAgentSignupResponses, VerifyCliSignupData, VerifyCliSignupError, VerifyCliSignupErrors, VerifyCliSignupInput, VerifyCliSignupResponse, VerifyCliSignupResponses, VerifyDomainData, VerifyDomainError, VerifyDomainErrors, VerifyDomainResponse, VerifyDomainResponses, WakeAuthorization, WakeDispatch, WakeSchedule, WebhookSecret, X402Challenge, X402DeclinedPayment, X402EmailChallenge, X402EmailChallengeDetails, X402NonceBinding, X402PaymentPayload, X402PaymentRequirements, X402PayoutAddress, X402Receipt, X402SpendPolicy } from './types.gen.js'; diff --git a/packages/api-core/src/api/sdk.gen.ts b/packages/api-core/src/api/sdk.gen.ts index c449954..af7bd10 100644 --- a/packages/api-core/src/api/sdk.gen.ts +++ b/packages/api-core/src/api/sdk.gen.ts @@ -2,7 +2,7 @@ import type { Client, Options as Options2, TDataShape } from './client/index.js'; import { client } from './client.gen.js'; -import type { AddDomainData, AddDomainErrors, AddDomainResponses, CliLogoutData, CliLogoutErrors, CliLogoutResponses, CreateAgentAccountData, CreateAgentAccountErrors, CreateAgentAccountResponses, CreateAgentClaimLinkData, CreateAgentClaimLinkErrors, CreateAgentClaimLinkResponses, CreateChallengeData, CreateChallengeErrors, CreateChallengeResponses, CreateEmailChallengeData, CreateEmailChallengeErrors, CreateEmailChallengeResponses, CreateEndpointData, CreateEndpointErrors, CreateEndpointResponses, CreateFilterData, CreateFilterErrors, CreateFilterResponses, CreateFunctionData, CreateFunctionErrors, CreateFunctionResponses, CreateFunctionSecretData, CreateFunctionSecretErrors, CreateFunctionSecretResponses, CreateOrgSecretData, CreateOrgSecretErrors, CreateOrgSecretResponses, CreateRegistryData, CreateRegistryErrors, CreateRegistryResponses, CreateRouteData, CreateRouteErrors, CreateRouteResponses, CreateWakeAuthorizationData, CreateWakeAuthorizationErrors, CreateWakeAuthorizationResponses, CreateWakeScheduleData, CreateWakeScheduleErrors, CreateWakeScheduleResponses, DecideRegistryRequestData, DecideRegistryRequestErrors, DecideRegistryRequestResponses, DefineAgentData, DefineAgentErrors, DefineAgentResponses, DeleteDomainData, DeleteDomainErrors, DeleteDomainResponses, DeleteEmailData, DeleteEmailErrors, DeleteEmailResponses, DeleteEndpointData, DeleteEndpointErrors, DeleteEndpointResponses, DeleteFilterData, DeleteFilterErrors, DeleteFilterResponses, DeleteFunctionData, DeleteFunctionErrors, DeleteFunctionResponses, DeleteFunctionSecretData, DeleteFunctionSecretErrors, DeleteFunctionSecretResponses, DeleteMemoryData, DeleteMemoryErrors, DeleteMemoryResponses, DeleteOrgSecretData, DeleteOrgSecretErrors, DeleteOrgSecretResponses, DeleteRegistryData, DeleteRegistryErrors, DeleteRegistryResponses, DeleteRouteData, DeleteRouteErrors, DeleteRouteResponses, DeleteWakeAuthorizationData, DeleteWakeAuthorizationErrors, DeleteWakeAuthorizationResponses, DeleteWakeScheduleData, DeleteWakeScheduleErrors, DeleteWakeScheduleResponses, DiscardEmailContentData, DiscardEmailContentErrors, DiscardEmailContentResponses, DownloadAttachmentsData, DownloadAttachmentsErrors, DownloadAttachmentsResponses, DownloadDomainZoneFileData, DownloadDomainZoneFileErrors, DownloadDomainZoneFileResponses, DownloadRawEmailData, DownloadRawEmailErrors, DownloadRawEmailResponses, GetAccountData, GetAccountErrors, GetAccountResponses, GetAgentData, GetAgentErrors, GetAgentResponses, GetChallengeData, GetChallengeErrors, GetChallengeResponses, GetConversationData, GetConversationErrors, GetConversationResponses, GetEmailData, GetEmailErrors, GetEmailResponses, GetFunctionData, GetFunctionErrors, GetFunctionResponses, GetFunctionRoutingData, GetFunctionRoutingErrors, GetFunctionRoutingResponses, GetFunctionTestRunTraceData, GetFunctionTestRunTraceErrors, GetFunctionTestRunTraceResponses, GetInboxStatusData, GetInboxStatusErrors, GetInboxStatusResponses, GetMemoryData, GetMemoryErrors, GetMemoryResponses, GetOrgRoutingTopologyData, GetOrgRoutingTopologyErrors, GetOrgRoutingTopologyResponses, GetRegistryData, GetRegistryErrors, GetRegistryResponses, GetSendPermissionsData, GetSendPermissionsErrors, GetSendPermissionsResponses, GetSentEmailData, GetSentEmailErrors, GetSentEmailResponses, GetSpendPolicyData, GetSpendPolicyErrors, GetSpendPolicyResponses, GetStorageStatsData, GetStorageStatsErrors, GetStorageStatsResponses, GetThreadData, GetThreadErrors, GetThreadResponses, GetWakeScheduleData, GetWakeScheduleErrors, GetWakeScheduleResponses, GetWebhookSecretData, GetWebhookSecretErrors, GetWebhookSecretResponses, ListDeclinedPaymentsData, ListDeclinedPaymentsErrors, ListDeclinedPaymentsResponses, ListDeliveriesData, ListDeliveriesErrors, ListDeliveriesResponses, ListDomainsData, ListDomainsErrors, ListDomainsResponses, ListEmailsData, ListEmailsErrors, ListEmailsResponses, ListEndpointsData, ListEndpointsErrors, ListEndpointsResponses, ListFiltersData, ListFiltersErrors, ListFiltersResponses, ListFunctionLogsData, ListFunctionLogsErrors, ListFunctionLogsResponses, ListFunctionsData, ListFunctionSecretsData, ListFunctionSecretsErrors, ListFunctionSecretsResponses, ListFunctionsErrors, ListFunctionsResponses, ListOrgSecretsData, ListOrgSecretsErrors, ListOrgSecretsResponses, ListPayoutAddressesData, ListPayoutAddressesErrors, ListPayoutAddressesResponses, ListRegistriesData, ListRegistriesErrors, ListRegistriesResponses, ListRegistryAgentsData, ListRegistryAgentsResponses, ListRegistryRequestsData, ListRegistryRequestsErrors, ListRegistryRequestsResponses, ListRoutesData, ListRoutesErrors, ListRoutesResponses, ListSentEmailsData, ListSentEmailsErrors, ListSentEmailsResponses, ListWakeAuthorizationsData, ListWakeAuthorizationsErrors, ListWakeAuthorizationsResponses, ListWakeDispatchesData, ListWakeDispatchesErrors, ListWakeDispatchesResponses, ListWakeSchedulesData, ListWakeSchedulesErrors, ListWakeSchedulesResponses, PayChallengeData, PayChallengeErrors, PayChallengeResponses, PollCliLoginData, PollCliLoginErrors, PollCliLoginResponses, PublishAgentData, PublishAgentErrors, PublishAgentResponses, RegisterPayoutAddressData, RegisterPayoutAddressErrors, RegisterPayoutAddressResponses, ReorderRoutesData, ReorderRoutesErrors, ReorderRoutesResponses, ReplayDeliveryData, ReplayDeliveryErrors, ReplayDeliveryResponses, ReplayEmailWebhooksData, ReplayEmailWebhooksErrors, ReplayEmailWebhooksResponses, ReplyToEmailData, ReplyToEmailErrors, ReplyToEmailResponses, ResendAgentSignupVerificationData, ResendAgentSignupVerificationErrors, ResendAgentSignupVerificationResponses, ResendCliSignupVerificationData, ResendCliSignupVerificationErrors, ResendCliSignupVerificationResponses, ResolveRegistryHandleData, ResolveRegistryHandleErrors, ResolveRegistryHandleResponses, RotateWebhookSecretData, RotateWebhookSecretErrors, RotateWebhookSecretResponses, RunWakeScheduleData, RunWakeScheduleErrors, RunWakeScheduleResponses, SearchEmailsData, SearchEmailsErrors, SearchEmailsResponses, SearchMemoriesData, SearchMemoriesErrors, SearchMemoriesResponses, SemanticSearchData, SemanticSearchErrors, SemanticSearchResponses, SendEmailData, SendEmailErrors, SendEmailResponses, SetFunctionRouteData, SetFunctionRouteErrors, SetFunctionRouteResponses, SetFunctionSecretData, SetFunctionSecretErrors, SetFunctionSecretResponses, SetMemoryData, SetMemoryErrors, SetMemoryResponses, SetOrgSecretData, SetOrgSecretErrors, SetOrgSecretResponses, SimulateRouteData, SimulateRouteErrors, SimulateRouteResponses, StartAgentClaimData, StartAgentClaimErrors, StartAgentClaimResponses, StartAgentSignupData, StartAgentSignupErrors, StartAgentSignupResponses, StartCliLoginData, StartCliLoginErrors, StartCliLoginResponses, StartCliSignupData, StartCliSignupErrors, StartCliSignupResponses, TestEndpointData, TestEndpointErrors, TestEndpointResponses, TestFunctionData, TestFunctionErrors, TestFunctionResponses, UnpublishAgentData, UnpublishAgentErrors, UnpublishAgentResponses, UnsetFunctionRouteData, UnsetFunctionRouteErrors, UnsetFunctionRouteResponses, UpdateAccountData, UpdateAccountErrors, UpdateAccountResponses, UpdateDomainData, UpdateDomainErrors, UpdateDomainResponses, UpdateEndpointData, UpdateEndpointErrors, UpdateEndpointResponses, UpdateFilterData, UpdateFilterErrors, UpdateFilterResponses, UpdateFunctionData, UpdateFunctionErrors, UpdateFunctionResponses, UpdateRegistryData, UpdateRegistryErrors, UpdateRegistryResponses, UpdateRouteData, UpdateRouteErrors, UpdateRouteResponses, UpdateSpendPolicyData, UpdateSpendPolicyErrors, UpdateSpendPolicyResponses, UpdateWakeAuthorizationData, UpdateWakeAuthorizationErrors, UpdateWakeAuthorizationResponses, UpdateWakeScheduleData, UpdateWakeScheduleErrors, UpdateWakeScheduleResponses, VerifyAgentClaimData, VerifyAgentClaimErrors, VerifyAgentClaimResponses, VerifyAgentSignupData, VerifyAgentSignupErrors, VerifyAgentSignupResponses, VerifyCliSignupData, VerifyCliSignupErrors, VerifyCliSignupResponses, VerifyDomainData, VerifyDomainErrors, VerifyDomainResponses } from './types.gen.js'; +import type { AddDomainData, AddDomainErrors, AddDomainResponses, CliLogoutData, CliLogoutErrors, CliLogoutResponses, CreateAgentAccountData, CreateAgentAccountErrors, CreateAgentAccountResponses, CreateAgentClaimLinkData, CreateAgentClaimLinkErrors, CreateAgentClaimLinkResponses, CreateChallengeData, CreateChallengeErrors, CreateChallengeResponses, CreateEmailChallengeData, CreateEmailChallengeErrors, CreateEmailChallengeResponses, CreateEndpointData, CreateEndpointErrors, CreateEndpointResponses, CreateFilterData, CreateFilterErrors, CreateFilterResponses, CreateFunctionData, CreateFunctionErrors, CreateFunctionResponses, CreateFunctionSecretData, CreateFunctionSecretErrors, CreateFunctionSecretResponses, CreateOrgSecretData, CreateOrgSecretErrors, CreateOrgSecretResponses, CreateRegistryData, CreateRegistryErrors, CreateRegistryResponses, CreateRouteData, CreateRouteErrors, CreateRouteResponses, CreateWakeAuthorizationData, CreateWakeAuthorizationErrors, CreateWakeAuthorizationResponses, CreateWakeScheduleData, CreateWakeScheduleErrors, CreateWakeScheduleResponses, DecideRegistryRequestData, DecideRegistryRequestErrors, DecideRegistryRequestResponses, DefineAgentData, DefineAgentErrors, DefineAgentResponses, DeleteDomainData, DeleteDomainErrors, DeleteDomainResponses, DeleteEmailData, DeleteEmailErrors, DeleteEmailResponses, DeleteEndpointData, DeleteEndpointErrors, DeleteEndpointResponses, DeleteFilterData, DeleteFilterErrors, DeleteFilterResponses, DeleteFunctionData, DeleteFunctionErrors, DeleteFunctionResponses, DeleteFunctionSecretData, DeleteFunctionSecretErrors, DeleteFunctionSecretResponses, DeleteMemoryData, DeleteMemoryErrors, DeleteMemoryResponses, DeleteOrgSecretData, DeleteOrgSecretErrors, DeleteOrgSecretResponses, DeleteRegistryData, DeleteRegistryErrors, DeleteRegistryResponses, DeleteRouteData, DeleteRouteErrors, DeleteRouteResponses, DeleteWakeAuthorizationData, DeleteWakeAuthorizationErrors, DeleteWakeAuthorizationResponses, DeleteWakeScheduleData, DeleteWakeScheduleErrors, DeleteWakeScheduleResponses, DiscardEmailContentData, DiscardEmailContentErrors, DiscardEmailContentResponses, DownloadAttachmentsData, DownloadAttachmentsErrors, DownloadAttachmentsResponses, DownloadDomainZoneFileData, DownloadDomainZoneFileErrors, DownloadDomainZoneFileResponses, DownloadRawEmailData, DownloadRawEmailErrors, DownloadRawEmailResponses, GetAccountData, GetAccountErrors, GetAccountResponses, GetAgentData, GetAgentErrors, GetAgentResponses, GetChallengeData, GetChallengeErrors, GetChallengeResponses, GetConversationData, GetConversationErrors, GetConversationResponses, GetEmailData, GetEmailErrors, GetEmailResponses, GetFunctionData, GetFunctionErrors, GetFunctionResponses, GetFunctionRoutingData, GetFunctionRoutingErrors, GetFunctionRoutingResponses, GetFunctionTestRunTraceData, GetFunctionTestRunTraceErrors, GetFunctionTestRunTraceResponses, GetInboxStatusData, GetInboxStatusErrors, GetInboxStatusResponses, GetMemoryData, GetMemoryErrors, GetMemoryResponses, GetOrgRoutingTopologyData, GetOrgRoutingTopologyErrors, GetOrgRoutingTopologyResponses, GetRegistryData, GetRegistryErrors, GetRegistryResponses, GetSendPermissionsData, GetSendPermissionsErrors, GetSendPermissionsResponses, GetSentEmailData, GetSentEmailErrors, GetSentEmailResponses, GetSpendPolicyData, GetSpendPolicyErrors, GetSpendPolicyResponses, GetStorageStatsData, GetStorageStatsErrors, GetStorageStatsResponses, GetTemplateData, GetTemplateErrors, GetTemplateInstallData, GetTemplateInstallErrors, GetTemplateInstallResponses, GetTemplateResponses, GetThreadData, GetThreadErrors, GetThreadResponses, GetWakeScheduleData, GetWakeScheduleErrors, GetWakeScheduleResponses, GetWebhookSecretData, GetWebhookSecretErrors, GetWebhookSecretResponses, InstallTemplateData, InstallTemplateErrors, InstallTemplateResponses, ListDeclinedPaymentsData, ListDeclinedPaymentsErrors, ListDeclinedPaymentsResponses, ListDeliveriesData, ListDeliveriesErrors, ListDeliveriesResponses, ListDomainsData, ListDomainsErrors, ListDomainsResponses, ListEmailsData, ListEmailsErrors, ListEmailsResponses, ListEndpointsData, ListEndpointsErrors, ListEndpointsResponses, ListFiltersData, ListFiltersErrors, ListFiltersResponses, ListFunctionLogsData, ListFunctionLogsErrors, ListFunctionLogsResponses, ListFunctionsData, ListFunctionSecretsData, ListFunctionSecretsErrors, ListFunctionSecretsResponses, ListFunctionsErrors, ListFunctionsResponses, ListOrgSecretsData, ListOrgSecretsErrors, ListOrgSecretsResponses, ListPayoutAddressesData, ListPayoutAddressesErrors, ListPayoutAddressesResponses, ListRegistriesData, ListRegistriesErrors, ListRegistriesResponses, ListRegistryAgentsData, ListRegistryAgentsResponses, ListRegistryRequestsData, ListRegistryRequestsErrors, ListRegistryRequestsResponses, ListRoutesData, ListRoutesErrors, ListRoutesResponses, ListSentEmailsData, ListSentEmailsErrors, ListSentEmailsResponses, ListTemplatesData, ListTemplatesErrors, ListTemplatesResponses, ListWakeAuthorizationsData, ListWakeAuthorizationsErrors, ListWakeAuthorizationsResponses, ListWakeDispatchesData, ListWakeDispatchesErrors, ListWakeDispatchesResponses, ListWakeSchedulesData, ListWakeSchedulesErrors, ListWakeSchedulesResponses, PayChallengeData, PayChallengeErrors, PayChallengeResponses, PollCliLoginData, PollCliLoginErrors, PollCliLoginResponses, PublishAgentData, PublishAgentErrors, PublishAgentResponses, RegisterPayoutAddressData, RegisterPayoutAddressErrors, RegisterPayoutAddressResponses, ReorderRoutesData, ReorderRoutesErrors, ReorderRoutesResponses, ReplayDeliveryData, ReplayDeliveryErrors, ReplayDeliveryResponses, ReplayEmailWebhooksData, ReplayEmailWebhooksErrors, ReplayEmailWebhooksResponses, ReplyToEmailData, ReplyToEmailErrors, ReplyToEmailResponses, ResendAgentSignupVerificationData, ResendAgentSignupVerificationErrors, ResendAgentSignupVerificationResponses, ResendCliSignupVerificationData, ResendCliSignupVerificationErrors, ResendCliSignupVerificationResponses, ResolveRegistryHandleData, ResolveRegistryHandleErrors, ResolveRegistryHandleResponses, RotateWebhookSecretData, RotateWebhookSecretErrors, RotateWebhookSecretResponses, RunWakeScheduleData, RunWakeScheduleErrors, RunWakeScheduleResponses, SearchEmailsData, SearchEmailsErrors, SearchEmailsResponses, SearchMemoriesData, SearchMemoriesErrors, SearchMemoriesResponses, SemanticSearchData, SemanticSearchErrors, SemanticSearchResponses, SendEmailData, SendEmailErrors, SendEmailResponses, SetFunctionRouteData, SetFunctionRouteErrors, SetFunctionRouteResponses, SetFunctionSecretData, SetFunctionSecretErrors, SetFunctionSecretResponses, SetMemoryData, SetMemoryErrors, SetMemoryResponses, SetOrgSecretData, SetOrgSecretErrors, SetOrgSecretResponses, SimulateRouteData, SimulateRouteErrors, SimulateRouteResponses, StartAgentClaimData, StartAgentClaimErrors, StartAgentClaimResponses, StartAgentSignupData, StartAgentSignupErrors, StartAgentSignupResponses, StartCliLoginData, StartCliLoginErrors, StartCliLoginResponses, StartCliSignupData, StartCliSignupErrors, StartCliSignupResponses, TestEndpointData, TestEndpointErrors, TestEndpointResponses, TestFunctionData, TestFunctionErrors, TestFunctionResponses, UnpublishAgentData, UnpublishAgentErrors, UnpublishAgentResponses, UnsetFunctionRouteData, UnsetFunctionRouteErrors, UnsetFunctionRouteResponses, UpdateAccountData, UpdateAccountErrors, UpdateAccountResponses, UpdateDomainData, UpdateDomainErrors, UpdateDomainResponses, UpdateEndpointData, UpdateEndpointErrors, UpdateEndpointResponses, UpdateFilterData, UpdateFilterErrors, UpdateFilterResponses, UpdateFunctionData, UpdateFunctionErrors, UpdateFunctionResponses, UpdateRegistryData, UpdateRegistryErrors, UpdateRegistryResponses, UpdateRouteData, UpdateRouteErrors, UpdateRouteResponses, UpdateSpendPolicyData, UpdateSpendPolicyErrors, UpdateSpendPolicyResponses, UpdateWakeAuthorizationData, UpdateWakeAuthorizationErrors, UpdateWakeAuthorizationResponses, UpdateWakeScheduleData, UpdateWakeScheduleErrors, UpdateWakeScheduleResponses, VerifyAgentClaimData, VerifyAgentClaimErrors, VerifyAgentClaimResponses, VerifyAgentSignupData, VerifyAgentSignupErrors, VerifyAgentSignupResponses, VerifyCliSignupData, VerifyCliSignupErrors, VerifyCliSignupResponses, VerifyDomainData, VerifyDomainErrors, VerifyDomainResponses } from './types.gen.js'; export type Options = Options2 & { /** @@ -1740,6 +1740,57 @@ export const searchMemories = (options?: O ...options }); +/** + * List function templates + * + * List approved Function templates available for browsing and + * installation. Results are cacheable and paginated with + * `data.next_cursor`. + * + */ +export const listTemplates = (options?: Options) => (options?.client ?? client).get({ url: '/templates', ...options }); + +/** + * Get a function template + * + * Fetch one approved Function template by slug, including its manifest + * snapshot and README. The stored source files used for install are not + * returned. + * + */ +export const getTemplate = (options: Options) => (options.client ?? client).get({ url: '/templates/{id}', ...options }); + +/** + * Install a function template + * + * Start a one-shot deploy of an approved deploy-mode Function template. + * The response returns an install record immediately; poll + * `GET /templates/installs/{id}` for progress. + * + */ +export const installTemplate = (options: Options) => (options.client ?? client).post({ + security: [{ scheme: 'bearer', type: 'http' }], + url: '/templates/{id}/install', + ...options, + headers: { + ...(options.body !== undefined && { 'Content-Type': 'application/json' }), + ...options.headers + } +}); + +/** + * Get template install status + * + * Fetch the current state of a template install. Reads may advance the + * self-test phase when a reply effect has been observed. + * + */ +export const getTemplateInstall = (options: Options) => (options.client ?? client).get({ + security: [{ scheme: 'bearer', type: 'http' }], + url: '/templates/installs/{id}', + ...options +}); + /** * List payout addresses * diff --git a/packages/api-core/src/api/types.gen.ts b/packages/api-core/src/api/types.gen.ts index 94991c5..5d5272c 100644 --- a/packages/api-core/src/api/types.gen.ts +++ b/packages/api-core/src/api/types.gen.ts @@ -502,7 +502,7 @@ export type PaginationMeta = { export type ErrorResponse = { success: boolean; error: { - code: 'unauthorized' | 'forbidden' | 'not_found' | 'validation_error' | 'rate_limit_exceeded' | 'internal_error' | 'conflict' | 'mx_conflict' | 'outbound_disabled' | 'cannot_send_from_domain' | 'recipient_not_allowed' | 'outbound_key_missing' | 'outbound_unreachable' | 'outbound_key_invalid' | 'outbound_capacity_exhausted' | 'outbound_response_malformed' | 'outbound_relay_failed' | 'discard_not_enabled' | 'inbound_not_repliable' | 'search_timeout' | 'authorization_pending' | 'slow_down' | 'access_denied' | 'expired_token' | 'invalid_device_code' | 'invalid_signup_code' | 'invalid_signup_token' | 'invalid_verification_code' | 'email_delivery_failed' | 'clerk_signup_failed' | 'no_orgs_for_user' | 'org_not_accessible' | 'feature_disabled' | 'memory_conflict' | 'developer_usage_credit_exhausted' | 'no_payout_address' | 'ownership_proof_failed' | 'payment_verification_failed' | 'payment_declined' | 'challenge_expired' | 'settlement_failed'; + code: 'unauthorized' | 'forbidden' | 'not_found' | 'validation_error' | 'rate_limit_exceeded' | 'internal_error' | 'conflict' | 'mx_conflict' | 'outbound_disabled' | 'cannot_send_from_domain' | 'recipient_not_allowed' | 'outbound_key_missing' | 'outbound_unreachable' | 'outbound_key_invalid' | 'outbound_capacity_exhausted' | 'outbound_response_malformed' | 'outbound_relay_failed' | 'discard_not_enabled' | 'inbound_not_repliable' | 'search_timeout' | 'authorization_pending' | 'slow_down' | 'access_denied' | 'expired_token' | 'invalid_device_code' | 'invalid_signup_code' | 'invalid_signup_token' | 'invalid_verification_code' | 'email_delivery_failed' | 'clerk_signup_failed' | 'no_orgs_for_user' | 'org_not_accessible' | 'feature_disabled' | 'memory_conflict' | 'template_not_installable' | 'scaffold_only' | 'invalid_variables' | 'unknown_secrets' | 'missing_secrets' | 'no_inbound_domain' | 'domain_cannot_send' | 'address_taken' | 'route_cap_reached' | 'name_exhausted' | 'developer_usage_credit_exhausted' | 'no_payout_address' | 'ownership_proof_failed' | 'payment_verification_failed' | 'payment_declined' | 'challenge_expired' | 'settlement_failed'; message: string; /** * Optional structured data that callers can inspect to recover @@ -3761,6 +3761,174 @@ export type DeleteMemoryResult = { scope: MemoryResolvedScope; }; +export type TemplateAuthor = { + id: string; + name: string; + url?: string; +}; + +export type TemplateSource = { + mode: string; + dir: string; +} | { + mode: string; + file: string; +}; + +export type TemplateInstall = { + mode: 'deploy' | 'scaffold'; + editFiles: Array; + reason: string; +}; + +export type TemplateSecret = { + key: string; + required: boolean; + description?: string; +}; + +export type TemplateSecretGroup = { + keys: Array; + min: number; + description?: string; +}; + +export type TemplateVariableValidation = { + pattern?: string; + maxLength?: number; +}; + +export type TemplateVariable = { + key: string; + prompt: string; + default?: string; + file?: string; + type: 'string' | 'select' | 'url' | 'email'; + options?: Array; + validation?: TemplateVariableValidation; +}; + +export type TemplateSetup = { + agent: string; + prompt: string; + produces: Array; +}; + +export type TemplateManifest = { + schemaVersion: number; + /** + * Stable template slug from the manifest. + */ + id: string; + title: string; + summary: string; + description?: string; + author: TemplateAuthor; + tags: Array; + source: TemplateSource; + install: TemplateInstall; + secrets: Array; + secretGroups: Array; + variables: Array; + setup?: TemplateSetup; + postInstall?: string; +}; + +export type TemplateRegistryStatus = 'pending' | 'approved' | 'rejected'; + +export type TemplateRegistrySummary = { + id: string; + /** + * Stable template slug used in template URLs and install commands. + */ + slug: string; + title: string; + summary: string; + author: TemplateAuthor; + tags: Array; + verified: boolean; + install_count: number; + /** + * GitHub repository in owner/repo form. + */ + github_repo: string; + created_at: string; + updated_at: string; +}; + +export type TemplateRegistryDetail = { + id: string; + /** + * Stable template slug used in template URLs and install commands. + */ + slug: string; + title: string; + summary: string; + author: TemplateAuthor; + tags: Array; + verified: boolean; + install_count: number; + /** + * GitHub repository in owner/repo form. + */ + github_repo: string; + created_at: string; + updated_at: string; + description: string | null; + github_sha: string; + github_path: string | null; + manifest: TemplateManifest; + readme: string | null; + status: TemplateRegistryStatus; +}; + +export type TemplateRegistryPage = { + items: Array; + /** + * Cursor to pass as the next `cursor` query value, or null when there are no more templates. + */ + next_cursor: string | null; +}; + +export type InstallTemplateBody = { + /** + * Localpart to claim on the selected inbound domain. Defaults to the template slug. + */ + address?: string; + /** + * Org domain name to claim the address on. Defaults to the org's newest active domain. + */ + domain?: string; + /** + * Template variable values keyed by manifest variable key. + */ + variables?: { + [key: string]: string; + }; + /** + * Secret values keyed by manifest secret key. + */ + secrets?: { + [key: string]: string; + }; +}; + +export type TemplateInstallState = 'deploying' | 'connecting' | 'bound' | 'tested' | 'deploy_failed' | 'bind_failed' | 'test_failed'; + +export type TemplateInstallStatus = { + id: string; + /** + * Template slug for this install. + */ + template_slug: string; + state: TemplateInstallState; + address: string | null; + function_id: string | null; + error: string | null; + created_at: string; + updated_at: string; +}; + /** * Resource UUID */ @@ -7766,6 +7934,202 @@ export type SearchMemoriesResponses = { export type SearchMemoriesResponse = SearchMemoriesResponses[keyof SearchMemoriesResponses]; +export type ListTemplatesData = { + body?: never; + path?: never; + query?: { + /** + * Search templates by title, summary, or slug. + */ + q?: string; + /** + * Filter templates by an exact tag. + */ + tag?: string; + /** + * Cursor from a previous response `data.next_cursor` value. + */ + cursor?: string; + /** + * Maximum number of templates to return. The server caps this at 100. + */ + limit?: number; + }; + url: '/templates'; +}; + +export type ListTemplatesErrors = { + /** + * Invalid request parameters + */ + 400: ErrorResponse; + /** + * Rate limit exceeded + */ + 429: ErrorResponse; +}; + +export type ListTemplatesError = ListTemplatesErrors[keyof ListTemplatesErrors]; + +export type ListTemplatesResponses = { + /** + * Paginated template registry summaries + */ + 200: SuccessEnvelope & { + data: TemplateRegistryPage; + }; +}; + +export type ListTemplatesResponse = ListTemplatesResponses[keyof ListTemplatesResponses]; + +export type GetTemplateData = { + body?: never; + path: { + /** + * Template slug from the template manifest. + */ + id: string; + }; + query?: never; + url: '/templates/{id}'; +}; + +export type GetTemplateErrors = { + /** + * Invalid request parameters + */ + 400: ErrorResponse; + /** + * Resource not found + */ + 404: ErrorResponse; + /** + * Rate limit exceeded + */ + 429: ErrorResponse; +}; + +export type GetTemplateError = GetTemplateErrors[keyof GetTemplateErrors]; + +export type GetTemplateResponses = { + /** + * Template registry detail + */ + 200: SuccessEnvelope & { + data: TemplateRegistryDetail; + }; +}; + +export type GetTemplateResponse = GetTemplateResponses[keyof GetTemplateResponses]; + +export type InstallTemplateData = { + body: InstallTemplateBody; + path: { + /** + * Template slug from the template manifest. + */ + id: string; + }; + query?: never; + url: '/templates/{id}/install'; +}; + +export type InstallTemplateErrors = { + /** + * Invalid request parameters + */ + 400: ErrorResponse; + /** + * Invalid or missing API key + */ + 401: ErrorResponse; + /** + * Authenticated caller lacks permission for the operation + */ + 403: ErrorResponse; + /** + * Resource not found + */ + 404: ErrorResponse; + /** + * The request conflicts with the current state of the resource + */ + 409: ErrorResponse; + /** + * The request was well-formed but could not be processed. For Payments + * this covers a missing payout address, a failed payment verification, a + * spend-policy decline, or an expired challenge; `error.code` distinguishes + * them. + * + */ + 422: ErrorResponse; + /** + * Rate limit exceeded + */ + 429: ErrorResponse; +}; + +export type InstallTemplateError = InstallTemplateErrors[keyof InstallTemplateErrors]; + +export type InstallTemplateResponses = { + /** + * Template install started + */ + 201: SuccessEnvelope & { + data: TemplateInstallStatus; + }; +}; + +export type InstallTemplateResponse = InstallTemplateResponses[keyof InstallTemplateResponses]; + +export type GetTemplateInstallData = { + body?: never; + path: { + /** + * Template install UUID. + */ + id: string; + }; + query?: never; + url: '/templates/installs/{id}'; +}; + +export type GetTemplateInstallErrors = { + /** + * Invalid request parameters + */ + 400: ErrorResponse; + /** + * Invalid or missing API key + */ + 401: ErrorResponse; + /** + * Authenticated caller lacks permission for the operation + */ + 403: ErrorResponse; + /** + * Resource not found + */ + 404: ErrorResponse; + /** + * Rate limit exceeded + */ + 429: ErrorResponse; +}; + +export type GetTemplateInstallError = GetTemplateInstallErrors[keyof GetTemplateInstallErrors]; + +export type GetTemplateInstallResponses = { + /** + * Current template install status + */ + 200: SuccessEnvelope & { + data: TemplateInstallStatus; + }; +}; + +export type GetTemplateInstallResponse = GetTemplateInstallResponses[keyof GetTemplateInstallResponses]; + export type ListPayoutAddressesData = { body?: never; path?: never; diff --git a/packages/api-core/src/openapi/openapi.generated.ts b/packages/api-core/src/openapi/openapi.generated.ts index e40a115..fd4dff0 100644 --- a/packages/api-core/src/openapi/openapi.generated.ts +++ b/packages/api-core/src/openapi/openapi.generated.ts @@ -104,6 +104,10 @@ export const openapiDocument: Record = { "name": "Memories", "description": "Durable org-scoped or function-scoped JSON key-value storage for\nagents and functions. Keys are caller-defined. Function scope is\nalways addressed by the function id UUID, not by function name.\n" }, + { + "name": "Templates", + "description": "Browse approved Function templates, install deploy-mode templates, and\npoll install progress.\n" + }, { "name": "Registries", "description": "The Agent Registry: ownable directories of agents, addressable by a\nregistry-scoped handle. A registry's publish policy (owner_only, request,\nor open) decides whether a publish lists immediately or pends owner\napproval. An agent is defined once with a globally unique,\nreachability-verified address, then published into any registry under a\nhandle. Discovery reads (list, resolve, get) are public for public\nregistries; managing a registry and moderating requests use the owner's\nAPI key.\n" @@ -5695,6 +5699,307 @@ export const openapiDocument: Record = { } } }, + "/templates": { + "get": { + "operationId": "listTemplates", + "summary": "List function templates", + "description": "List approved Function templates available for browsing and\ninstallation. Results are cacheable and paginated with\n`data.next_cursor`.\n", + "tags": [ + "Templates" + ], + "security": [], + "parameters": [ + { + "name": "q", + "in": "query", + "required": false, + "description": "Search templates by title, summary, or slug.", + "schema": { + "type": "string", + "minLength": 1 + } + }, + { + "name": "tag", + "in": "query", + "required": false, + "description": "Filter templates by an exact tag.", + "schema": { + "type": "string", + "minLength": 1 + } + }, + { + "name": "cursor", + "in": "query", + "required": false, + "description": "Cursor from a previous response `data.next_cursor` value.", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "description": "Maximum number of templates to return. The server caps this at 100.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + } + } + ], + "responses": { + "200": { + "description": "Paginated template registry summaries", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/SuccessEnvelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TemplateRegistryPage" + } + }, + "required": [ + "data" + ] + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/ValidationError" + }, + "429": { + "$ref": "#/components/responses/RateLimited" + } + } + } + }, + "/templates/{id}": { + "get": { + "operationId": "getTemplate", + "summary": "Get a function template", + "description": "Fetch one approved Function template by slug, including its manifest\nsnapshot and README. The stored source files used for install are not\nreturned.\n", + "tags": [ + "Templates" + ], + "security": [], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "Template slug from the template manifest.", + "schema": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$" + } + } + ], + "responses": { + "200": { + "description": "Template registry detail", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/SuccessEnvelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TemplateRegistryDetail" + } + }, + "required": [ + "data" + ] + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/ValidationError" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "429": { + "$ref": "#/components/responses/RateLimited" + } + } + } + }, + "/templates/{id}/install": { + "post": { + "operationId": "installTemplate", + "summary": "Install a function template", + "description": "Start a one-shot deploy of an approved deploy-mode Function template.\nThe response returns an install record immediately; poll\n`GET /templates/installs/{id}` for progress.\n", + "tags": [ + "Templates" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "Template slug from the template manifest.", + "schema": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstallTemplateBody" + } + } + } + }, + "responses": { + "201": { + "description": "Template install started", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/SuccessEnvelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TemplateInstallStatus" + } + }, + "required": [ + "data" + ] + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/ValidationError" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "422": { + "$ref": "#/components/responses/UnprocessableEntity" + }, + "429": { + "$ref": "#/components/responses/RateLimited" + } + } + } + }, + "/templates/installs/{id}": { + "get": { + "operationId": "getTemplateInstall", + "summary": "Get template install status", + "description": "Fetch the current state of a template install. Reads may advance the\nself-test phase when a reply effect has been observed.\n", + "tags": [ + "Templates" + ], + "security": [ + { + "BearerAuth": [] + } + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "Template install UUID.", + "schema": { + "type": "string", + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" + } + } + ], + "responses": { + "200": { + "description": "Current template install status", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/SuccessEnvelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TemplateInstallStatus" + } + }, + "required": [ + "data" + ] + } + ] + } + } + } + }, + "400": { + "$ref": "#/components/responses/ValidationError" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "429": { + "$ref": "#/components/responses/RateLimited" + } + } + } + }, "/x402/payout-addresses": { "post": { "operationId": "registerPayoutAddress", @@ -8401,6 +8706,16 @@ export const openapiDocument: Record = { "org_not_accessible", "feature_disabled", "memory_conflict", + "template_not_installable", + "scaffold_only", + "invalid_variables", + "unknown_secrets", + "missing_secrets", + "no_inbound_domain", + "domain_cannot_send", + "address_taken", + "route_cap_reached", + "name_exhausted", "developer_usage_credit_exhausted", "no_payout_address", "ownership_proof_failed", @@ -14721,6 +15036,593 @@ export const openapiDocument: Record = { "key", "scope" ] + }, + "TemplateAuthor": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "format": "uri" + } + }, + "required": [ + "id", + "name" + ] + }, + "TemplateSource": { + "oneOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "type": "string", + "const": "managed-build" + }, + "dir": { + "type": "string", + "minLength": 1, + "default": "." + } + }, + "required": [ + "mode", + "dir" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "type": "string", + "const": "bundle" + }, + "file": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "mode", + "file" + ] + } + ] + }, + "TemplateInstall": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "type": "string", + "enum": [ + "deploy", + "scaffold" + ] + }, + "editFiles": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "reason": { + "type": "string", + "default": "" + } + }, + "required": [ + "mode", + "editFiles", + "reason" + ] + }, + "TemplateSecret": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "type": "string", + "pattern": "^[A-Z_][A-Z0-9_]*$" + }, + "required": { + "type": "boolean", + "default": true + }, + "description": { + "type": "string" + } + }, + "required": [ + "key", + "required" + ] + }, + "TemplateSecretGroup": { + "type": "object", + "additionalProperties": false, + "properties": { + "keys": { + "type": "array", + "minItems": 2, + "items": { + "type": "string", + "pattern": "^[A-Z_][A-Z0-9_]*$" + } + }, + "min": { + "type": "integer", + "minimum": 1, + "default": 1 + }, + "description": { + "type": "string" + } + }, + "required": [ + "keys", + "min" + ] + }, + "TemplateVariableValidation": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string", + "minLength": 1 + }, + "maxLength": { + "type": "integer", + "minimum": 1 + } + } + }, + "TemplateVariable": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "type": "string", + "minLength": 1 + }, + "prompt": { + "type": "string", + "minLength": 1 + }, + "default": { + "type": "string" + }, + "file": { + "type": "string", + "minLength": 1 + }, + "type": { + "type": "string", + "enum": [ + "string", + "select", + "url", + "email" + ], + "default": "string" + }, + "options": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "validation": { + "$ref": "#/components/schemas/TemplateVariableValidation" + } + }, + "required": [ + "key", + "prompt", + "type" + ] + }, + "TemplateSetup": { + "type": "object", + "additionalProperties": false, + "properties": { + "agent": { + "type": "string", + "minLength": 1 + }, + "prompt": { + "type": "string", + "minLength": 1 + }, + "produces": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + } + }, + "required": [ + "agent", + "prompt", + "produces" + ] + }, + "TemplateManifest": { + "type": "object", + "additionalProperties": false, + "properties": { + "schemaVersion": { + "type": "integer", + "const": 1 + }, + "id": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$", + "description": "Stable template slug from the manifest." + }, + "title": { + "type": "string", + "minLength": 1 + }, + "summary": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "author": { + "$ref": "#/components/schemas/TemplateAuthor" + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "source": { + "$ref": "#/components/schemas/TemplateSource" + }, + "install": { + "$ref": "#/components/schemas/TemplateInstall" + }, + "secrets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TemplateSecret" + } + }, + "secretGroups": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TemplateSecretGroup" + } + }, + "variables": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TemplateVariable" + } + }, + "setup": { + "$ref": "#/components/schemas/TemplateSetup" + }, + "postInstall": { + "type": "string" + } + }, + "required": [ + "schemaVersion", + "id", + "title", + "summary", + "author", + "tags", + "source", + "install", + "secrets", + "secretGroups", + "variables" + ] + }, + "TemplateRegistryStatus": { + "type": "string", + "enum": [ + "pending", + "approved", + "rejected" + ] + }, + "TemplateRegistrySummary": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "slug": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$", + "description": "Stable template slug used in template URLs and install commands." + }, + "title": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "author": { + "$ref": "#/components/schemas/TemplateAuthor" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "verified": { + "type": "boolean" + }, + "install_count": { + "type": "integer", + "minimum": 0 + }, + "github_repo": { + "type": "string", + "pattern": "^[A-Za-z0-9-]+/[A-Za-z0-9_.-]+$", + "description": "GitHub repository in owner/repo form." + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "id", + "slug", + "title", + "summary", + "author", + "tags", + "verified", + "install_count", + "github_repo", + "created_at", + "updated_at" + ] + }, + "TemplateRegistryDetail": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "slug": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$", + "description": "Stable template slug used in template URLs and install commands." + }, + "title": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "author": { + "$ref": "#/components/schemas/TemplateAuthor" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "verified": { + "type": "boolean" + }, + "install_count": { + "type": "integer", + "minimum": 0 + }, + "github_repo": { + "type": "string", + "pattern": "^[A-Za-z0-9-]+/[A-Za-z0-9_.-]+$", + "description": "GitHub repository in owner/repo form." + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "github_sha": { + "type": "string" + }, + "github_path": { + "type": [ + "string", + "null" + ] + }, + "manifest": { + "$ref": "#/components/schemas/TemplateManifest" + }, + "readme": { + "type": [ + "string", + "null" + ] + }, + "status": { + "$ref": "#/components/schemas/TemplateRegistryStatus" + } + }, + "required": [ + "id", + "slug", + "title", + "summary", + "author", + "tags", + "verified", + "install_count", + "github_repo", + "created_at", + "updated_at", + "description", + "github_sha", + "github_path", + "manifest", + "readme", + "status" + ] + }, + "TemplateRegistryPage": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TemplateRegistrySummary" + } + }, + "next_cursor": { + "type": [ + "string", + "null" + ], + "description": "Cursor to pass as the next `cursor` query value, or null when there are no more templates." + } + }, + "required": [ + "items", + "next_cursor" + ] + }, + "InstallTemplateBody": { + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9._-]{0,63}$", + "description": "Localpart to claim on the selected inbound domain. Defaults to the template slug." + }, + "domain": { + "type": "string", + "minLength": 3, + "description": "Org domain name to claim the address on. Defaults to the org's newest active domain." + }, + "variables": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Template variable values keyed by manifest variable key." + }, + "secrets": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Secret values keyed by manifest secret key." + } + } + }, + "TemplateInstallState": { + "type": "string", + "enum": [ + "deploying", + "connecting", + "bound", + "tested", + "deploy_failed", + "bind_failed", + "test_failed" + ] + }, + "TemplateInstallStatus": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "template_slug": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$", + "description": "Template slug for this install." + }, + "state": { + "$ref": "#/components/schemas/TemplateInstallState" + }, + "address": { + "type": [ + "string", + "null" + ] + }, + "function_id": { + "type": [ + "string", + "null" + ], + "format": "uuid" + }, + "error": { + "type": [ + "string", + "null" + ] + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "id", + "template_slug", + "state", + "address", + "function_id", + "error", + "created_at", + "updated_at" + ] } } } diff --git a/packages/api-core/src/openapi/operations.generated.ts b/packages/api-core/src/openapi/operations.generated.ts index fb6253c..be702a8 100644 --- a/packages/api-core/src/openapi/operations.generated.ts +++ b/packages/api-core/src/openapi/operations.generated.ts @@ -11718,6 +11718,781 @@ export const operationManifest: PrimitiveOperationManifest[] = [ "tag": "Sending", "tagCommand": "sending" }, + { + "binaryResponse": false, + "bodyRequired": false, + "command": "get-template", + "description": "Fetch one approved Function template by slug, including its manifest\nsnapshot and README. The stored source files used for install are not\nreturned.\n", + "hasJsonBody": false, + "method": "GET", + "operationId": "getTemplate", + "path": "/templates/{id}", + "pathParams": [ + { + "description": "Template slug from the template manifest.", + "enum": null, + "name": "id", + "required": true, + "type": "string" + } + ], + "queryParams": [], + "requestSchema": null, + "responseSchema": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "slug": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$", + "description": "Stable template slug used in template URLs and install commands." + }, + "title": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "author": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "format": "uri" + } + }, + "required": [ + "id", + "name" + ] + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "verified": { + "type": "boolean" + }, + "install_count": { + "type": "integer", + "minimum": 0 + }, + "github_repo": { + "type": "string", + "pattern": "^[A-Za-z0-9-]+/[A-Za-z0-9_.-]+$", + "description": "GitHub repository in owner/repo form." + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "github_sha": { + "type": "string" + }, + "github_path": { + "type": [ + "string", + "null" + ] + }, + "manifest": { + "type": "object", + "additionalProperties": false, + "properties": { + "schemaVersion": { + "type": "integer", + "const": 1 + }, + "id": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$", + "description": "Stable template slug from the manifest." + }, + "title": { + "type": "string", + "minLength": 1 + }, + "summary": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "author": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "format": "uri" + } + }, + "required": [ + "id", + "name" + ] + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "source": { + "oneOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "type": "string", + "const": "managed-build" + }, + "dir": { + "type": "string", + "minLength": 1, + "default": "." + } + }, + "required": [ + "mode", + "dir" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "type": "string", + "const": "bundle" + }, + "file": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "mode", + "file" + ] + } + ] + }, + "install": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "type": "string", + "enum": [ + "deploy", + "scaffold" + ] + }, + "editFiles": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "reason": { + "type": "string", + "default": "" + } + }, + "required": [ + "mode", + "editFiles", + "reason" + ] + }, + "secrets": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "type": "string", + "pattern": "^[A-Z_][A-Z0-9_]*$" + }, + "required": { + "type": "boolean", + "default": true + }, + "description": { + "type": "string" + } + }, + "required": [ + "key", + "required" + ] + } + }, + "secretGroups": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "keys": { + "type": "array", + "minItems": 2, + "items": { + "type": "string", + "pattern": "^[A-Z_][A-Z0-9_]*$" + } + }, + "min": { + "type": "integer", + "minimum": 1, + "default": 1 + }, + "description": { + "type": "string" + } + }, + "required": [ + "keys", + "min" + ] + } + }, + "variables": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "type": "string", + "minLength": 1 + }, + "prompt": { + "type": "string", + "minLength": 1 + }, + "default": { + "type": "string" + }, + "file": { + "type": "string", + "minLength": 1 + }, + "type": { + "type": "string", + "enum": [ + "string", + "select", + "url", + "email" + ], + "default": "string" + }, + "options": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "validation": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string", + "minLength": 1 + }, + "maxLength": { + "type": "integer", + "minimum": 1 + } + } + } + }, + "required": [ + "key", + "prompt", + "type" + ] + } + }, + "setup": { + "type": "object", + "additionalProperties": false, + "properties": { + "agent": { + "type": "string", + "minLength": 1 + }, + "prompt": { + "type": "string", + "minLength": 1 + }, + "produces": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + } + }, + "required": [ + "agent", + "prompt", + "produces" + ] + }, + "postInstall": { + "type": "string" + } + }, + "required": [ + "schemaVersion", + "id", + "title", + "summary", + "author", + "tags", + "source", + "install", + "secrets", + "secretGroups", + "variables" + ] + }, + "readme": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": "string", + "enum": [ + "pending", + "approved", + "rejected" + ] + } + }, + "required": [ + "id", + "slug", + "title", + "summary", + "author", + "tags", + "verified", + "install_count", + "github_repo", + "created_at", + "updated_at", + "description", + "github_sha", + "github_path", + "manifest", + "readme", + "status" + ] + }, + "sdkName": "getTemplate", + "summary": "Get a function template", + "tag": "Templates", + "tagCommand": "templates" + }, + { + "binaryResponse": false, + "bodyRequired": false, + "command": "get-template-install", + "description": "Fetch the current state of a template install. Reads may advance the\nself-test phase when a reply effect has been observed.\n", + "hasJsonBody": false, + "method": "GET", + "operationId": "getTemplateInstall", + "path": "/templates/installs/{id}", + "pathParams": [ + { + "description": "Template install UUID.", + "enum": null, + "name": "id", + "required": true, + "type": "string" + } + ], + "queryParams": [], + "requestSchema": null, + "responseSchema": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "template_slug": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$", + "description": "Template slug for this install." + }, + "state": { + "type": "string", + "enum": [ + "deploying", + "connecting", + "bound", + "tested", + "deploy_failed", + "bind_failed", + "test_failed" + ] + }, + "address": { + "type": [ + "string", + "null" + ] + }, + "function_id": { + "type": [ + "string", + "null" + ], + "format": "uuid" + }, + "error": { + "type": [ + "string", + "null" + ] + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "id", + "template_slug", + "state", + "address", + "function_id", + "error", + "created_at", + "updated_at" + ] + }, + "sdkName": "getTemplateInstall", + "summary": "Get template install status", + "tag": "Templates", + "tagCommand": "templates" + }, + { + "binaryResponse": false, + "bodyRequired": true, + "command": "install-template", + "description": "Start a one-shot deploy of an approved deploy-mode Function template.\nThe response returns an install record immediately; poll\n`GET /templates/installs/{id}` for progress.\n", + "hasJsonBody": true, + "method": "POST", + "operationId": "installTemplate", + "path": "/templates/{id}/install", + "pathParams": [ + { + "description": "Template slug from the template manifest.", + "enum": null, + "name": "id", + "required": true, + "type": "string" + } + ], + "queryParams": [], + "requestSchema": { + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9._-]{0,63}$", + "description": "Localpart to claim on the selected inbound domain. Defaults to the template slug." + }, + "domain": { + "type": "string", + "minLength": 3, + "description": "Org domain name to claim the address on. Defaults to the org's newest active domain." + }, + "variables": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Template variable values keyed by manifest variable key." + }, + "secrets": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Secret values keyed by manifest secret key." + } + } + }, + "responseSchema": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "template_slug": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$", + "description": "Template slug for this install." + }, + "state": { + "type": "string", + "enum": [ + "deploying", + "connecting", + "bound", + "tested", + "deploy_failed", + "bind_failed", + "test_failed" + ] + }, + "address": { + "type": [ + "string", + "null" + ] + }, + "function_id": { + "type": [ + "string", + "null" + ], + "format": "uuid" + }, + "error": { + "type": [ + "string", + "null" + ] + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "id", + "template_slug", + "state", + "address", + "function_id", + "error", + "created_at", + "updated_at" + ] + }, + "sdkName": "installTemplate", + "summary": "Install a function template", + "tag": "Templates", + "tagCommand": "templates" + }, + { + "binaryResponse": false, + "bodyRequired": false, + "command": "list-templates", + "description": "List approved Function templates available for browsing and\ninstallation. Results are cacheable and paginated with\n`data.next_cursor`.\n", + "hasJsonBody": false, + "method": "GET", + "operationId": "listTemplates", + "path": "/templates", + "pathParams": [], + "queryParams": [ + { + "description": "Search templates by title, summary, or slug.", + "enum": null, + "name": "q", + "required": false, + "type": "string" + }, + { + "description": "Filter templates by an exact tag.", + "enum": null, + "name": "tag", + "required": false, + "type": "string" + }, + { + "description": "Cursor from a previous response `data.next_cursor` value.", + "enum": null, + "name": "cursor", + "required": false, + "type": "string" + }, + { + "default": 50, + "description": "Maximum number of templates to return. The server caps this at 100.", + "enum": null, + "maximum": 100, + "minimum": 1, + "name": "limit", + "required": false, + "type": "integer" + } + ], + "requestSchema": null, + "responseSchema": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "slug": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9_-]{0,62}$", + "description": "Stable template slug used in template URLs and install commands." + }, + "title": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "author": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "format": "uri" + } + }, + "required": [ + "id", + "name" + ] + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "verified": { + "type": "boolean" + }, + "install_count": { + "type": "integer", + "minimum": 0 + }, + "github_repo": { + "type": "string", + "pattern": "^[A-Za-z0-9-]+/[A-Za-z0-9_.-]+$", + "description": "GitHub repository in owner/repo form." + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "id", + "slug", + "title", + "summary", + "author", + "tags", + "verified", + "install_count", + "github_repo", + "created_at", + "updated_at" + ] + } + }, + "next_cursor": { + "type": [ + "string", + "null" + ], + "description": "Cursor to pass as the next `cursor` query value, or null when there are no more templates." + } + }, + "required": [ + "items", + "next_cursor" + ] + }, + "sdkName": "listTemplates", + "summary": "List function templates", + "tag": "Templates", + "tagCommand": "templates" + }, { "binaryResponse": false, "bodyRequired": false, diff --git a/sdk-go/api/oas_cfg_gen.go b/sdk-go/api/oas_cfg_gen.go index eea2847..fa5a2dd 100644 --- a/sdk-go/api/oas_cfg_gen.go +++ b/sdk-go/api/oas_cfg_gen.go @@ -18,19 +18,23 @@ import ( ) var regexMap = map[string]ogenregex.Regexp{ - "^0x[0-9a-fA-F]+$": ogenregex.MustCompile("^0x[0-9a-fA-F]+$"), - "^0x[0-9a-fA-F]{40}$": ogenregex.MustCompile("^0x[0-9a-fA-F]{40}$"), - "^[0-9]+$": ogenregex.MustCompile("^[0-9]+$"), - "^[0-9a-f]{64}$": ogenregex.MustCompile("^[0-9a-f]{64}$"), - "^[1-9][0-9]{0,38}$": ogenregex.MustCompile("^[1-9][0-9]{0,38}$"), - "^[A-Z_][A-Z0-9_]*$": ogenregex.MustCompile("^[A-Z_][A-Z0-9_]*$"), - "^[A-Za-z0-9][A-Za-z0-9._+-]{0,63}$": ogenregex.MustCompile("^[A-Za-z0-9][A-Za-z0-9._+-]{0,63}$"), + "^0x[0-9a-fA-F]+$": ogenregex.MustCompile("^0x[0-9a-fA-F]+$"), + "^0x[0-9a-fA-F]{40}$": ogenregex.MustCompile("^0x[0-9a-fA-F]{40}$"), + "^[0-9]+$": ogenregex.MustCompile("^[0-9]+$"), + "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$": ogenregex.MustCompile("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"), + "^[0-9a-f]{64}$": ogenregex.MustCompile("^[0-9a-f]{64}$"), + "^[1-9][0-9]{0,38}$": ogenregex.MustCompile("^[1-9][0-9]{0,38}$"), + "^[A-Z_][A-Z0-9_]*$": ogenregex.MustCompile("^[A-Z_][A-Z0-9_]*$"), + "^[A-Za-z0-9-]+/[A-Za-z0-9_.-]+$": ogenregex.MustCompile("^[A-Za-z0-9-]+/[A-Za-z0-9_.-]+$"), + "^[A-Za-z0-9][A-Za-z0-9._+-]{0,63}$": ogenregex.MustCompile("^[A-Za-z0-9][A-Za-z0-9._+-]{0,63}$"), "^[BCDFGHJKLMNPQRSTVWXZ]{4}-[BCDFGHJKLMNPQRSTVWXZ]{4}$": ogenregex.MustCompile("^[BCDFGHJKLMNPQRSTVWXZ]{4}-[BCDFGHJKLMNPQRSTVWXZ]{4}$"), - "^[\\x21-\\x7E]+$": ogenregex.MustCompile("^[\\x21-\\x7E]+$"), - "^[^\\x00-\\x1F\\x7F]+$": ogenregex.MustCompile("^[^\\x00-\\x1F\\x7F]+$"), - "^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$": ogenregex.MustCompile("^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$"), - "^[a-z0-9_-]{1,64}$": ogenregex.MustCompile("^[a-z0-9_-]{1,64}$"), - "^\\d+$": ogenregex.MustCompile("^\\d+$"), + "^[\\x21-\\x7E]+$": ogenregex.MustCompile("^[\\x21-\\x7E]+$"), + "^[^\\x00-\\x1F\\x7F]+$": ogenregex.MustCompile("^[^\\x00-\\x1F\\x7F]+$"), + "^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$": ogenregex.MustCompile("^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$"), + "^[a-z0-9][a-z0-9._-]{0,63}$": ogenregex.MustCompile("^[a-z0-9][a-z0-9._-]{0,63}$"), + "^[a-z0-9][a-z0-9_-]{0,62}$": ogenregex.MustCompile("^[a-z0-9][a-z0-9_-]{0,62}$"), + "^[a-z0-9_-]{1,64}$": ogenregex.MustCompile("^[a-z0-9_-]{1,64}$"), + "^\\d+$": ogenregex.MustCompile("^\\d+$"), } var ( // Allocate option closure once. diff --git a/sdk-go/api/oas_client_gen.go b/sdk-go/api/oas_client_gen.go index c829801..1510ab7 100644 --- a/sdk-go/api/oas_client_gen.go +++ b/sdk-go/api/oas_client_gen.go @@ -542,6 +542,21 @@ type Invoker interface { // // GET /account/storage GetStorageStats(ctx context.Context) (GetStorageStatsRes, error) + // GetTemplate invokes getTemplate operation. + // + // Fetch one approved Function template by slug, including its manifest + // snapshot and README. The stored source files used for install are not + // returned. + // + // GET /templates/{id} + GetTemplate(ctx context.Context, params GetTemplateParams) (GetTemplateRes, error) + // GetTemplateInstall invokes getTemplateInstall operation. + // + // Fetch the current state of a template install. Reads may advance the + // self-test phase when a reply effect has been observed. + // + // GET /templates/installs/{id} + GetTemplateInstall(ctx context.Context, params GetTemplateInstallParams) (GetTemplateInstallRes, error) // GetThread invokes getThread operation. // // Returns a conversation thread: its metadata plus the inbound @@ -586,6 +601,14 @@ type Invoker interface { // // GET /account/webhook-secret GetWebhookSecret(ctx context.Context) (GetWebhookSecretRes, error) + // InstallTemplate invokes installTemplate operation. + // + // Start a one-shot deploy of an approved deploy-mode Function template. + // The response returns an install record immediately; poll + // `GET /templates/installs/{id}` for progress. + // + // POST /templates/{id}/install + InstallTemplate(ctx context.Context, request *InstallTemplateBody, params InstallTemplateParams) (InstallTemplateRes, error) // ListDeclinedPayments invokes listDeclinedPayments operation. // // The 50 most recent payments your org's spend policy declined, newest @@ -736,6 +759,14 @@ type Invoker interface { // // GET /sent-emails ListSentEmails(ctx context.Context, params ListSentEmailsParams) (ListSentEmailsRes, error) + // ListTemplates invokes listTemplates operation. + // + // List approved Function templates available for browsing and + // installation. Results are cacheable and paginated with + // `data.next_cursor`. + // + // GET /templates + ListTemplates(ctx context.Context, params ListTemplatesParams) (ListTemplatesRes, error) // ListWakeAuthorizations invokes listWakeAuthorizations operation. // // Returns the per-target allowlist grants that authorize which senders may @@ -7455,6 +7486,226 @@ func (c *Client) sendGetStorageStats(ctx context.Context) (res GetStorageStatsRe return result, nil } +// GetTemplate invokes getTemplate operation. +// +// Fetch one approved Function template by slug, including its manifest +// snapshot and README. The stored source files used for install are not +// returned. +// +// GET /templates/{id} +func (c *Client) GetTemplate(ctx context.Context, params GetTemplateParams) (GetTemplateRes, error) { + res, err := c.sendGetTemplate(ctx, params) + return res, err +} + +func (c *Client) sendGetTemplate(ctx context.Context, params GetTemplateParams) (res GetTemplateRes, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("getTemplate"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.URLTemplateKey.String("/templates/{id}"), + } + otelAttrs = append(otelAttrs, c.cfg.Attributes...) + + // Run stopwatch. + startTime := time.Now() + defer func() { + // Use floating point division here for higher precision (instead of Millisecond method). + elapsedDuration := time.Since(startTime) + c.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), metric.WithAttributes(otelAttrs...)) + }() + + // Increment request counter. + c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + + // Start a span for this request. + ctx, span := c.cfg.Tracer.Start(ctx, GetTemplateOperation, + trace.WithAttributes(otelAttrs...), + clientSpanKind, + ) + // Track stage for error reporting. + var stage string + defer func() { + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, stage) + c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + } + span.End() + }() + + stage = "BuildURL" + u := uri.Clone(c.requestURL(ctx)) + var pathParts [2]string + pathParts[0] = "/templates/" + { + // Encode "id" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "id", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.StringToString(params.ID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "GET", u) + if err != nil { + return res, errors.Wrap(err, "create request") + } + + stage = "SendRequest" + resp, err := c.cfg.Client.Do(r) + if err != nil { + return res, errors.Wrap(err, "do request") + } + body := resp.Body + defer body.Close() + + stage = "DecodeResponse" + result, err := decodeGetTemplateResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// GetTemplateInstall invokes getTemplateInstall operation. +// +// Fetch the current state of a template install. Reads may advance the +// self-test phase when a reply effect has been observed. +// +// GET /templates/installs/{id} +func (c *Client) GetTemplateInstall(ctx context.Context, params GetTemplateInstallParams) (GetTemplateInstallRes, error) { + res, err := c.sendGetTemplateInstall(ctx, params) + return res, err +} + +func (c *Client) sendGetTemplateInstall(ctx context.Context, params GetTemplateInstallParams) (res GetTemplateInstallRes, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("getTemplateInstall"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.URLTemplateKey.String("/templates/installs/{id}"), + } + otelAttrs = append(otelAttrs, c.cfg.Attributes...) + + // Run stopwatch. + startTime := time.Now() + defer func() { + // Use floating point division here for higher precision (instead of Millisecond method). + elapsedDuration := time.Since(startTime) + c.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), metric.WithAttributes(otelAttrs...)) + }() + + // Increment request counter. + c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + + // Start a span for this request. + ctx, span := c.cfg.Tracer.Start(ctx, GetTemplateInstallOperation, + trace.WithAttributes(otelAttrs...), + clientSpanKind, + ) + // Track stage for error reporting. + var stage string + defer func() { + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, stage) + c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + } + span.End() + }() + + stage = "BuildURL" + u := uri.Clone(c.requestURL(ctx)) + var pathParts [2]string + pathParts[0] = "/templates/installs/" + { + // Encode "id" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "id", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.UUIDToString(params.ID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "GET", u) + if err != nil { + return res, errors.Wrap(err, "create request") + } + + { + type bitset = [1]uint8 + var satisfied bitset + { + stage = "Security:BearerAuth" + switch err := c.securityBearerAuth(ctx, GetTemplateInstallOperation, r); { + case err == nil: // if NO error + satisfied[0] |= 1 << 0 + case errors.Is(err, ogenerrors.ErrSkipClientSecurity): + // Skip this security. + default: + return res, errors.Wrap(err, "security \"BearerAuth\"") + } + } + + if ok := func() bool { + nextRequirement: + for _, requirement := range []bitset{ + {0b00000001}, + } { + for i, mask := range requirement { + if satisfied[i]&mask != mask { + continue nextRequirement + } + } + return true + } + return false + }(); !ok { + return res, ogenerrors.ErrSecurityRequirementIsNotSatisfied + } + } + + stage = "SendRequest" + resp, err := c.cfg.Client.Do(r) + if err != nil { + return res, errors.Wrap(err, "do request") + } + body := resp.Body + defer body.Close() + + stage = "DecodeResponse" + result, err := decodeGetTemplateInstallResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + // GetThread invokes getThread operation. // // Returns a conversation thread: its metadata plus the inbound @@ -7838,6 +8089,137 @@ func (c *Client) sendGetWebhookSecret(ctx context.Context) (res GetWebhookSecret return result, nil } +// InstallTemplate invokes installTemplate operation. +// +// Start a one-shot deploy of an approved deploy-mode Function template. +// The response returns an install record immediately; poll +// `GET /templates/installs/{id}` for progress. +// +// POST /templates/{id}/install +func (c *Client) InstallTemplate(ctx context.Context, request *InstallTemplateBody, params InstallTemplateParams) (InstallTemplateRes, error) { + res, err := c.sendInstallTemplate(ctx, request, params) + return res, err +} + +func (c *Client) sendInstallTemplate(ctx context.Context, request *InstallTemplateBody, params InstallTemplateParams) (res InstallTemplateRes, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("installTemplate"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.URLTemplateKey.String("/templates/{id}/install"), + } + otelAttrs = append(otelAttrs, c.cfg.Attributes...) + + // Run stopwatch. + startTime := time.Now() + defer func() { + // Use floating point division here for higher precision (instead of Millisecond method). + elapsedDuration := time.Since(startTime) + c.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), metric.WithAttributes(otelAttrs...)) + }() + + // Increment request counter. + c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + + // Start a span for this request. + ctx, span := c.cfg.Tracer.Start(ctx, InstallTemplateOperation, + trace.WithAttributes(otelAttrs...), + clientSpanKind, + ) + // Track stage for error reporting. + var stage string + defer func() { + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, stage) + c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + } + span.End() + }() + + stage = "BuildURL" + u := uri.Clone(c.requestURL(ctx)) + var pathParts [3]string + pathParts[0] = "/templates/" + { + // Encode "id" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "id", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.StringToString(params.ID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + pathParts[2] = "/install" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create request") + } + if err := encodeInstallTemplateRequest(request, r); err != nil { + return res, errors.Wrap(err, "encode request") + } + + { + type bitset = [1]uint8 + var satisfied bitset + { + stage = "Security:BearerAuth" + switch err := c.securityBearerAuth(ctx, InstallTemplateOperation, r); { + case err == nil: // if NO error + satisfied[0] |= 1 << 0 + case errors.Is(err, ogenerrors.ErrSkipClientSecurity): + // Skip this security. + default: + return res, errors.Wrap(err, "security \"BearerAuth\"") + } + } + + if ok := func() bool { + nextRequirement: + for _, requirement := range []bitset{ + {0b00000001}, + } { + for i, mask := range requirement { + if satisfied[i]&mask != mask { + continue nextRequirement + } + } + return true + } + return false + }(); !ok { + return res, ogenerrors.ErrSecurityRequirementIsNotSatisfied + } + } + + stage = "SendRequest" + resp, err := c.cfg.Client.Do(r) + if err != nil { + return res, errors.Wrap(err, "do request") + } + body := resp.Body + defer body.Close() + + stage = "DecodeResponse" + result, err := decodeInstallTemplateResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + // ListDeclinedPayments invokes listDeclinedPayments operation. // // The 50 most recent payments your org's spend policy declined, newest @@ -10130,6 +10512,154 @@ func (c *Client) sendListSentEmails(ctx context.Context, params ListSentEmailsPa return result, nil } +// ListTemplates invokes listTemplates operation. +// +// List approved Function templates available for browsing and +// installation. Results are cacheable and paginated with +// `data.next_cursor`. +// +// GET /templates +func (c *Client) ListTemplates(ctx context.Context, params ListTemplatesParams) (ListTemplatesRes, error) { + res, err := c.sendListTemplates(ctx, params) + return res, err +} + +func (c *Client) sendListTemplates(ctx context.Context, params ListTemplatesParams) (res ListTemplatesRes, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("listTemplates"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.URLTemplateKey.String("/templates"), + } + otelAttrs = append(otelAttrs, c.cfg.Attributes...) + + // Run stopwatch. + startTime := time.Now() + defer func() { + // Use floating point division here for higher precision (instead of Millisecond method). + elapsedDuration := time.Since(startTime) + c.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), metric.WithAttributes(otelAttrs...)) + }() + + // Increment request counter. + c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + + // Start a span for this request. + ctx, span := c.cfg.Tracer.Start(ctx, ListTemplatesOperation, + trace.WithAttributes(otelAttrs...), + clientSpanKind, + ) + // Track stage for error reporting. + var stage string + defer func() { + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, stage) + c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + } + span.End() + }() + + stage = "BuildURL" + u := uri.Clone(c.requestURL(ctx)) + var pathParts [1]string + pathParts[0] = "/templates" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeQueryParams" + q := uri.NewQueryEncoder() + { + // Encode "q" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "q", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.Q.Get(); ok { + return e.EncodeValue(conv.StringToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "tag" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "tag", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.Tag.Get(); ok { + return e.EncodeValue(conv.StringToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "cursor" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "cursor", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.Cursor.Get(); ok { + return e.EncodeValue(conv.StringToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "limit" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "limit", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.Limit.Get(); ok { + return e.EncodeValue(conv.IntToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + u.RawQuery = q.Values().Encode() + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "GET", u) + if err != nil { + return res, errors.Wrap(err, "create request") + } + + stage = "SendRequest" + resp, err := c.cfg.Client.Do(r) + if err != nil { + return res, errors.Wrap(err, "do request") + } + body := resp.Body + defer body.Close() + + stage = "DecodeResponse" + result, err := decodeListTemplatesResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + // ListWakeAuthorizations invokes listWakeAuthorizations operation. // // Returns the per-target allowlist grants that authorize which senders may diff --git a/sdk-go/api/oas_defaults_gen.go b/sdk-go/api/oas_defaults_gen.go index 4a6252f..2324547 100644 --- a/sdk-go/api/oas_defaults_gen.go +++ b/sdk-go/api/oas_defaults_gen.go @@ -37,3 +37,43 @@ func (s *SemanticSearchInput) setDefaults() { s.Limit.SetTo(val) } } + +// setDefaults set default value of fields. +func (s *TemplateInstall) setDefaults() { + { + val := string("") + s.Reason = val + } +} + +// setDefaults set default value of fields. +func (s *TemplateSecret) setDefaults() { + { + val := bool(true) + s.Required = val + } +} + +// setDefaults set default value of fields. +func (s *TemplateSecretGroup) setDefaults() { + { + val := int(1) + s.Min = val + } +} + +// setDefaults set default value of fields. +func (s *TemplateSource0) setDefaults() { + { + val := string(".") + s.Dir = val + } +} + +// setDefaults set default value of fields. +func (s *TemplateVariable) setDefaults() { + { + val := TemplateVariableType("string") + s.Type = val + } +} diff --git a/sdk-go/api/oas_handlers_gen.go b/sdk-go/api/oas_handlers_gen.go index c263dec..7559ba1 100644 --- a/sdk-go/api/oas_handlers_gen.go +++ b/sdk-go/api/oas_handlers_gen.go @@ -9327,6 +9327,339 @@ func (s *Server) handleGetStorageStatsRequest(args [0]string, argsEscaped bool, } } +// handleGetTemplateRequest handles getTemplate operation. +// +// Fetch one approved Function template by slug, including its manifest +// snapshot and README. The stored source files used for install are not +// returned. +// +// GET /templates/{id} +func (s *Server) handleGetTemplateRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("getTemplate"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.HTTPRouteKey.String("/templates/{id}"), + } + // Add attributes from config. + otelAttrs = append(otelAttrs, s.cfg.Attributes...) + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), GetTemplateOperation, + trace.WithAttributes(otelAttrs...), + serverSpanKind, + ) + defer span.End() + + // Add Labeler to context. + labeler := &Labeler{attrs: otelAttrs} + ctx = contextWithLabeler(ctx, labeler) + + // Run stopwatch. + startTime := time.Now() + defer func() { + elapsedDuration := time.Since(startTime) + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + code := statusWriter.status + if code != 0 { + codeAttr := semconv.HTTPResponseStatusCode(code) + attrs = append(attrs, codeAttr) + span.SetAttributes(codeAttr) + } + attrOpt := metric.WithAttributes(attrs...) + + // Increment request counter. + s.requests.Add(ctx, 1, attrOpt) + + // Use floating point division here for higher precision (instead of Millisecond method). + s.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), attrOpt) + }() + + var ( + recordError = func(stage string, err error) { + span.RecordError(err) + + // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status + // Span Status MUST be left unset if HTTP status code was in the 1xx, 2xx or 3xx ranges, + // unless there was another error (e.g., network error receiving the response body; or 3xx codes with + // max redirects exceeded), in which case status MUST be set to Error. + code := statusWriter.status + if code < 100 || code >= 500 { + span.SetStatus(codes.Error, stage) + } + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + if code != 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(code)) + } + + s.errors.Add(ctx, 1, metric.WithAttributes(attrs...)) + } + err error + opErrContext = ogenerrors.OperationContext{ + Name: GetTemplateOperation, + ID: "getTemplate", + } + ) + params, err := decodeGetTemplateParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var rawBody []byte + + var response GetTemplateRes + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: GetTemplateOperation, + OperationSummary: "Get a function template", + OperationID: "getTemplate", + Body: nil, + RawBody: rawBody, + Params: middleware.Parameters{ + { + Name: "id", + In: "path", + }: params.ID, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = GetTemplateParams + Response = GetTemplateRes + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackGetTemplateParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.GetTemplate(ctx, params) + return response, err + }, + ) + } else { + response, err = s.h.GetTemplate(ctx, params) + } + if err != nil { + defer recordError("Internal", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + if err := encodeGetTemplateResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleGetTemplateInstallRequest handles getTemplateInstall operation. +// +// Fetch the current state of a template install. Reads may advance the +// self-test phase when a reply effect has been observed. +// +// GET /templates/installs/{id} +func (s *Server) handleGetTemplateInstallRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("getTemplateInstall"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.HTTPRouteKey.String("/templates/installs/{id}"), + } + // Add attributes from config. + otelAttrs = append(otelAttrs, s.cfg.Attributes...) + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), GetTemplateInstallOperation, + trace.WithAttributes(otelAttrs...), + serverSpanKind, + ) + defer span.End() + + // Add Labeler to context. + labeler := &Labeler{attrs: otelAttrs} + ctx = contextWithLabeler(ctx, labeler) + + // Run stopwatch. + startTime := time.Now() + defer func() { + elapsedDuration := time.Since(startTime) + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + code := statusWriter.status + if code != 0 { + codeAttr := semconv.HTTPResponseStatusCode(code) + attrs = append(attrs, codeAttr) + span.SetAttributes(codeAttr) + } + attrOpt := metric.WithAttributes(attrs...) + + // Increment request counter. + s.requests.Add(ctx, 1, attrOpt) + + // Use floating point division here for higher precision (instead of Millisecond method). + s.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), attrOpt) + }() + + var ( + recordError = func(stage string, err error) { + span.RecordError(err) + + // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status + // Span Status MUST be left unset if HTTP status code was in the 1xx, 2xx or 3xx ranges, + // unless there was another error (e.g., network error receiving the response body; or 3xx codes with + // max redirects exceeded), in which case status MUST be set to Error. + code := statusWriter.status + if code < 100 || code >= 500 { + span.SetStatus(codes.Error, stage) + } + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + if code != 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(code)) + } + + s.errors.Add(ctx, 1, metric.WithAttributes(attrs...)) + } + err error + opErrContext = ogenerrors.OperationContext{ + Name: GetTemplateInstallOperation, + ID: "getTemplateInstall", + } + ) + { + type bitset = [1]uint8 + var satisfied bitset + { + sctx, ok, err := s.securityBearerAuth(ctx, GetTemplateInstallOperation, r) + if err != nil { + err = &ogenerrors.SecurityError{ + OperationContext: opErrContext, + Security: "BearerAuth", + Err: err, + } + defer recordError("Security:BearerAuth", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + if ok { + satisfied[0] |= 1 << 0 + ctx = sctx + } + } + + if ok := func() bool { + nextRequirement: + for _, requirement := range []bitset{ + {0b00000001}, + } { + for i, mask := range requirement { + if satisfied[i]&mask != mask { + continue nextRequirement + } + } + return true + } + return false + }(); !ok { + err = &ogenerrors.SecurityError{ + OperationContext: opErrContext, + Err: ogenerrors.ErrSecurityRequirementIsNotSatisfied, + } + defer recordError("Security", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + } + params, err := decodeGetTemplateInstallParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var rawBody []byte + + var response GetTemplateInstallRes + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: GetTemplateInstallOperation, + OperationSummary: "Get template install status", + OperationID: "getTemplateInstall", + Body: nil, + RawBody: rawBody, + Params: middleware.Parameters{ + { + Name: "id", + In: "path", + }: params.ID, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = GetTemplateInstallParams + Response = GetTemplateInstallRes + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackGetTemplateInstallParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.GetTemplateInstall(ctx, params) + return response, err + }, + ) + } else { + response, err = s.h.GetTemplateInstall(ctx, params) + } + if err != nil { + defer recordError("Internal", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + if err := encodeGetTemplateInstallResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + // handleGetThreadRequest handles getThread operation. // // Returns a conversation thread: its metadata plus the inbound @@ -9534,15 +9867,217 @@ func (s *Server) handleGetWakeScheduleRequest(args [1]string, argsEscaped bool, statusWriter := &codeRecorder{ResponseWriter: w} w = statusWriter otelAttrs := []attribute.KeyValue{ - otelogen.OperationID("getWakeSchedule"), + otelogen.OperationID("getWakeSchedule"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.HTTPRouteKey.String("/wake/schedules/{id}"), + } + // Add attributes from config. + otelAttrs = append(otelAttrs, s.cfg.Attributes...) + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), GetWakeScheduleOperation, + trace.WithAttributes(otelAttrs...), + serverSpanKind, + ) + defer span.End() + + // Add Labeler to context. + labeler := &Labeler{attrs: otelAttrs} + ctx = contextWithLabeler(ctx, labeler) + + // Run stopwatch. + startTime := time.Now() + defer func() { + elapsedDuration := time.Since(startTime) + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + code := statusWriter.status + if code != 0 { + codeAttr := semconv.HTTPResponseStatusCode(code) + attrs = append(attrs, codeAttr) + span.SetAttributes(codeAttr) + } + attrOpt := metric.WithAttributes(attrs...) + + // Increment request counter. + s.requests.Add(ctx, 1, attrOpt) + + // Use floating point division here for higher precision (instead of Millisecond method). + s.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), attrOpt) + }() + + var ( + recordError = func(stage string, err error) { + span.RecordError(err) + + // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status + // Span Status MUST be left unset if HTTP status code was in the 1xx, 2xx or 3xx ranges, + // unless there was another error (e.g., network error receiving the response body; or 3xx codes with + // max redirects exceeded), in which case status MUST be set to Error. + code := statusWriter.status + if code < 100 || code >= 500 { + span.SetStatus(codes.Error, stage) + } + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + if code != 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(code)) + } + + s.errors.Add(ctx, 1, metric.WithAttributes(attrs...)) + } + err error + opErrContext = ogenerrors.OperationContext{ + Name: GetWakeScheduleOperation, + ID: "getWakeSchedule", + } + ) + { + type bitset = [1]uint8 + var satisfied bitset + { + sctx, ok, err := s.securityBearerAuth(ctx, GetWakeScheduleOperation, r) + if err != nil { + err = &ogenerrors.SecurityError{ + OperationContext: opErrContext, + Security: "BearerAuth", + Err: err, + } + defer recordError("Security:BearerAuth", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + if ok { + satisfied[0] |= 1 << 0 + ctx = sctx + } + } + + if ok := func() bool { + nextRequirement: + for _, requirement := range []bitset{ + {0b00000001}, + } { + for i, mask := range requirement { + if satisfied[i]&mask != mask { + continue nextRequirement + } + } + return true + } + return false + }(); !ok { + err = &ogenerrors.SecurityError{ + OperationContext: opErrContext, + Err: ogenerrors.ErrSecurityRequirementIsNotSatisfied, + } + defer recordError("Security", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + } + params, err := decodeGetWakeScheduleParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var rawBody []byte + + var response GetWakeScheduleRes + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: GetWakeScheduleOperation, + OperationSummary: "Get a wake schedule", + OperationID: "getWakeSchedule", + Body: nil, + RawBody: rawBody, + Params: middleware.Parameters{ + { + Name: "id", + In: "path", + }: params.ID, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = GetWakeScheduleParams + Response = GetWakeScheduleRes + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackGetWakeScheduleParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.GetWakeSchedule(ctx, params) + return response, err + }, + ) + } else { + response, err = s.h.GetWakeSchedule(ctx, params) + } + if err != nil { + defer recordError("Internal", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + if err := encodeGetWakeScheduleResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleGetWebhookSecretRequest handles getWebhookSecret operation. +// +// Returns the webhook signing secret for your account. If no +// secret exists yet, one is generated automatically on first +// access. +// Signing is account-scoped, not per-endpoint. Every webhook +// delivery from any of your registered endpoints is signed +// with this single secret. Rotate via +// `POST /account/webhook-secret/rotate`. +// **Secret format**: the returned string looks base64-shaped +// (e.g. `XNHBBW8VqoBjRfNs1tkZj11jTk...`) but is NOT base64. +// Use it AS-IS as a UTF-8 string when computing HMAC over a +// delivery body. Base64-decoding before HMAC will silently +// produce mismatched signatures. +// See the API-level "Webhook signing" section for the full +// wire format (header name, signed string shape, hash algo, +// tolerance) including a language-agnostic verification +// recipe. +// +// GET /account/webhook-secret +func (s *Server) handleGetWebhookSecretRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("getWebhookSecret"), semconv.HTTPRequestMethodKey.String("GET"), - semconv.HTTPRouteKey.String("/wake/schedules/{id}"), + semconv.HTTPRouteKey.String("/account/webhook-secret"), } // Add attributes from config. otelAttrs = append(otelAttrs, s.cfg.Attributes...) // Start a span for this request. - ctx, span := s.cfg.Tracer.Start(r.Context(), GetWakeScheduleOperation, + ctx, span := s.cfg.Tracer.Start(r.Context(), GetWebhookSecretOperation, trace.WithAttributes(otelAttrs...), serverSpanKind, ) @@ -9597,15 +10132,15 @@ func (s *Server) handleGetWakeScheduleRequest(args [1]string, argsEscaped bool, } err error opErrContext = ogenerrors.OperationContext{ - Name: GetWakeScheduleOperation, - ID: "getWakeSchedule", + Name: GetWebhookSecretOperation, + ID: "getWebhookSecret", } ) { type bitset = [1]uint8 var satisfied bitset { - sctx, ok, err := s.securityBearerAuth(ctx, GetWakeScheduleOperation, r) + sctx, ok, err := s.securityBearerAuth(ctx, GetWebhookSecretOperation, r) if err != nil { err = &ogenerrors.SecurityError{ OperationContext: opErrContext, @@ -9645,41 +10180,26 @@ func (s *Server) handleGetWakeScheduleRequest(args [1]string, argsEscaped bool, return } } - params, err := decodeGetWakeScheduleParams(args, argsEscaped, r) - if err != nil { - err = &ogenerrors.DecodeParamsError{ - OperationContext: opErrContext, - Err: err, - } - defer recordError("DecodeParams", err) - s.cfg.ErrorHandler(ctx, w, r, err) - return - } var rawBody []byte - var response GetWakeScheduleRes + var response GetWebhookSecretRes if m := s.cfg.Middleware; m != nil { mreq := middleware.Request{ Context: ctx, - OperationName: GetWakeScheduleOperation, - OperationSummary: "Get a wake schedule", - OperationID: "getWakeSchedule", + OperationName: GetWebhookSecretOperation, + OperationSummary: "Get webhook signing secret", + OperationID: "getWebhookSecret", Body: nil, RawBody: rawBody, - Params: middleware.Parameters{ - { - Name: "id", - In: "path", - }: params.ID, - }, - Raw: r, + Params: middleware.Parameters{}, + Raw: r, } type ( Request = struct{} - Params = GetWakeScheduleParams - Response = GetWakeScheduleRes + Params = struct{} + Response = GetWebhookSecretRes ) response, err = middleware.HookMiddleware[ Request, @@ -9688,14 +10208,14 @@ func (s *Server) handleGetWakeScheduleRequest(args [1]string, argsEscaped bool, ]( m, mreq, - unpackGetWakeScheduleParams, + nil, func(ctx context.Context, request Request, params Params) (response Response, err error) { - response, err = s.h.GetWakeSchedule(ctx, params) + response, err = s.h.GetWebhookSecret(ctx) return response, err }, ) } else { - response, err = s.h.GetWakeSchedule(ctx, params) + response, err = s.h.GetWebhookSecret(ctx) } if err != nil { defer recordError("Internal", err) @@ -9703,7 +10223,7 @@ func (s *Server) handleGetWakeScheduleRequest(args [1]string, argsEscaped bool, return } - if err := encodeGetWakeScheduleResponse(response, w, span); err != nil { + if err := encodeGetWebhookSecretResponse(response, w, span); err != nil { defer recordError("EncodeResponse", err) if !errors.Is(err, ht.ErrInternalServerErrorResponse) { s.cfg.ErrorHandler(ctx, w, r, err) @@ -9712,39 +10232,26 @@ func (s *Server) handleGetWakeScheduleRequest(args [1]string, argsEscaped bool, } } -// handleGetWebhookSecretRequest handles getWebhookSecret operation. +// handleInstallTemplateRequest handles installTemplate operation. // -// Returns the webhook signing secret for your account. If no -// secret exists yet, one is generated automatically on first -// access. -// Signing is account-scoped, not per-endpoint. Every webhook -// delivery from any of your registered endpoints is signed -// with this single secret. Rotate via -// `POST /account/webhook-secret/rotate`. -// **Secret format**: the returned string looks base64-shaped -// (e.g. `XNHBBW8VqoBjRfNs1tkZj11jTk...`) but is NOT base64. -// Use it AS-IS as a UTF-8 string when computing HMAC over a -// delivery body. Base64-decoding before HMAC will silently -// produce mismatched signatures. -// See the API-level "Webhook signing" section for the full -// wire format (header name, signed string shape, hash algo, -// tolerance) including a language-agnostic verification -// recipe. +// Start a one-shot deploy of an approved deploy-mode Function template. +// The response returns an install record immediately; poll +// `GET /templates/installs/{id}` for progress. // -// GET /account/webhook-secret -func (s *Server) handleGetWebhookSecretRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { +// POST /templates/{id}/install +func (s *Server) handleInstallTemplateRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { statusWriter := &codeRecorder{ResponseWriter: w} w = statusWriter otelAttrs := []attribute.KeyValue{ - otelogen.OperationID("getWebhookSecret"), - semconv.HTTPRequestMethodKey.String("GET"), - semconv.HTTPRouteKey.String("/account/webhook-secret"), + otelogen.OperationID("installTemplate"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/templates/{id}/install"), } // Add attributes from config. otelAttrs = append(otelAttrs, s.cfg.Attributes...) // Start a span for this request. - ctx, span := s.cfg.Tracer.Start(r.Context(), GetWebhookSecretOperation, + ctx, span := s.cfg.Tracer.Start(r.Context(), InstallTemplateOperation, trace.WithAttributes(otelAttrs...), serverSpanKind, ) @@ -9799,15 +10306,15 @@ func (s *Server) handleGetWebhookSecretRequest(args [0]string, argsEscaped bool, } err error opErrContext = ogenerrors.OperationContext{ - Name: GetWebhookSecretOperation, - ID: "getWebhookSecret", + Name: InstallTemplateOperation, + ID: "installTemplate", } ) { type bitset = [1]uint8 var satisfied bitset { - sctx, ok, err := s.securityBearerAuth(ctx, GetWebhookSecretOperation, r) + sctx, ok, err := s.securityBearerAuth(ctx, InstallTemplateOperation, r) if err != nil { err = &ogenerrors.SecurityError{ OperationContext: opErrContext, @@ -9847,26 +10354,56 @@ func (s *Server) handleGetWebhookSecretRequest(args [0]string, argsEscaped bool, return } } + params, err := decodeInstallTemplateParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } var rawBody []byte + request, rawBody, close, err := s.decodeInstallTemplateRequest(r) + if err != nil { + err = &ogenerrors.DecodeRequestError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeRequest", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + defer func() { + if err := close(); err != nil { + recordError("CloseRequest", err) + } + }() - var response GetWebhookSecretRes + var response InstallTemplateRes if m := s.cfg.Middleware; m != nil { mreq := middleware.Request{ Context: ctx, - OperationName: GetWebhookSecretOperation, - OperationSummary: "Get webhook signing secret", - OperationID: "getWebhookSecret", - Body: nil, + OperationName: InstallTemplateOperation, + OperationSummary: "Install a function template", + OperationID: "installTemplate", + Body: request, RawBody: rawBody, - Params: middleware.Parameters{}, - Raw: r, + Params: middleware.Parameters{ + { + Name: "id", + In: "path", + }: params.ID, + }, + Raw: r, } type ( - Request = struct{} - Params = struct{} - Response = GetWebhookSecretRes + Request = *InstallTemplateBody + Params = InstallTemplateParams + Response = InstallTemplateRes ) response, err = middleware.HookMiddleware[ Request, @@ -9875,14 +10412,14 @@ func (s *Server) handleGetWebhookSecretRequest(args [0]string, argsEscaped bool, ]( m, mreq, - nil, + unpackInstallTemplateParams, func(ctx context.Context, request Request, params Params) (response Response, err error) { - response, err = s.h.GetWebhookSecret(ctx) + response, err = s.h.InstallTemplate(ctx, request, params) return response, err }, ) } else { - response, err = s.h.GetWebhookSecret(ctx) + response, err = s.h.InstallTemplate(ctx, request, params) } if err != nil { defer recordError("Internal", err) @@ -9890,7 +10427,7 @@ func (s *Server) handleGetWebhookSecretRequest(args [0]string, argsEscaped bool, return } - if err := encodeGetWebhookSecretResponse(response, w, span); err != nil { + if err := encodeInstallTemplateResponse(response, w, span); err != nil { defer recordError("EncodeResponse", err) if !errors.Is(err, ht.ErrInternalServerErrorResponse) { s.cfg.ErrorHandler(ctx, w, r, err) @@ -12862,6 +13399,163 @@ func (s *Server) handleListSentEmailsRequest(args [0]string, argsEscaped bool, w } } +// handleListTemplatesRequest handles listTemplates operation. +// +// List approved Function templates available for browsing and +// installation. Results are cacheable and paginated with +// `data.next_cursor`. +// +// GET /templates +func (s *Server) handleListTemplatesRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("listTemplates"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.HTTPRouteKey.String("/templates"), + } + // Add attributes from config. + otelAttrs = append(otelAttrs, s.cfg.Attributes...) + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ListTemplatesOperation, + trace.WithAttributes(otelAttrs...), + serverSpanKind, + ) + defer span.End() + + // Add Labeler to context. + labeler := &Labeler{attrs: otelAttrs} + ctx = contextWithLabeler(ctx, labeler) + + // Run stopwatch. + startTime := time.Now() + defer func() { + elapsedDuration := time.Since(startTime) + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + code := statusWriter.status + if code != 0 { + codeAttr := semconv.HTTPResponseStatusCode(code) + attrs = append(attrs, codeAttr) + span.SetAttributes(codeAttr) + } + attrOpt := metric.WithAttributes(attrs...) + + // Increment request counter. + s.requests.Add(ctx, 1, attrOpt) + + // Use floating point division here for higher precision (instead of Millisecond method). + s.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), attrOpt) + }() + + var ( + recordError = func(stage string, err error) { + span.RecordError(err) + + // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status + // Span Status MUST be left unset if HTTP status code was in the 1xx, 2xx or 3xx ranges, + // unless there was another error (e.g., network error receiving the response body; or 3xx codes with + // max redirects exceeded), in which case status MUST be set to Error. + code := statusWriter.status + if code < 100 || code >= 500 { + span.SetStatus(codes.Error, stage) + } + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + if code != 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(code)) + } + + s.errors.Add(ctx, 1, metric.WithAttributes(attrs...)) + } + err error + opErrContext = ogenerrors.OperationContext{ + Name: ListTemplatesOperation, + ID: "listTemplates", + } + ) + params, err := decodeListTemplatesParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var rawBody []byte + + var response ListTemplatesRes + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ListTemplatesOperation, + OperationSummary: "List function templates", + OperationID: "listTemplates", + Body: nil, + RawBody: rawBody, + Params: middleware.Parameters{ + { + Name: "q", + In: "query", + }: params.Q, + { + Name: "tag", + In: "query", + }: params.Tag, + { + Name: "cursor", + In: "query", + }: params.Cursor, + { + Name: "limit", + In: "query", + }: params.Limit, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = ListTemplatesParams + Response = ListTemplatesRes + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackListTemplatesParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.ListTemplates(ctx, params) + return response, err + }, + ) + } else { + response, err = s.h.ListTemplates(ctx, params) + } + if err != nil { + defer recordError("Internal", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + if err := encodeListTemplatesResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + // handleListWakeAuthorizationsRequest handles listWakeAuthorizations operation. // // Returns the per-target allowlist grants that authorize which senders may diff --git a/sdk-go/api/oas_interfaces_gen.go b/sdk-go/api/oas_interfaces_gen.go index 2838605..bcc7e7e 100644 --- a/sdk-go/api/oas_interfaces_gen.go +++ b/sdk-go/api/oas_interfaces_gen.go @@ -197,6 +197,14 @@ type GetStorageStatsRes interface { getStorageStatsRes() } +type GetTemplateInstallRes interface { + getTemplateInstallRes() +} + +type GetTemplateRes interface { + getTemplateRes() +} + type GetThreadRes interface { getThreadRes() } @@ -209,6 +217,10 @@ type GetWebhookSecretRes interface { getWebhookSecretRes() } +type InstallTemplateRes interface { + installTemplateRes() +} + type ListDeclinedPaymentsRes interface { listDeclinedPaymentsRes() } @@ -269,6 +281,10 @@ type ListSentEmailsRes interface { listSentEmailsRes() } +type ListTemplatesRes interface { + listTemplatesRes() +} + type ListWakeAuthorizationsRes interface { listWakeAuthorizationsRes() } diff --git a/sdk-go/api/oas_json_gen.go b/sdk-go/api/oas_json_gen.go index 6c32c0c..aca22bf 100644 --- a/sdk-go/api/oas_json_gen.go +++ b/sdk-go/api/oas_json_gen.go @@ -19678,6 +19678,26 @@ func (s *ErrorResponseErrorCode) Decode(d *jx.Decoder) error { *s = ErrorResponseErrorCodeFeatureDisabled case ErrorResponseErrorCodeMemoryConflict: *s = ErrorResponseErrorCodeMemoryConflict + case ErrorResponseErrorCodeTemplateNotInstallable: + *s = ErrorResponseErrorCodeTemplateNotInstallable + case ErrorResponseErrorCodeScaffoldOnly: + *s = ErrorResponseErrorCodeScaffoldOnly + case ErrorResponseErrorCodeInvalidVariables: + *s = ErrorResponseErrorCodeInvalidVariables + case ErrorResponseErrorCodeUnknownSecrets: + *s = ErrorResponseErrorCodeUnknownSecrets + case ErrorResponseErrorCodeMissingSecrets: + *s = ErrorResponseErrorCodeMissingSecrets + case ErrorResponseErrorCodeNoInboundDomain: + *s = ErrorResponseErrorCodeNoInboundDomain + case ErrorResponseErrorCodeDomainCannotSend: + *s = ErrorResponseErrorCodeDomainCannotSend + case ErrorResponseErrorCodeAddressTaken: + *s = ErrorResponseErrorCodeAddressTaken + case ErrorResponseErrorCodeRouteCapReached: + *s = ErrorResponseErrorCodeRouteCapReached + case ErrorResponseErrorCodeNameExhausted: + *s = ErrorResponseErrorCodeNameExhausted case ErrorResponseErrorCodeDeveloperUsageCreditExhausted: *s = ErrorResponseErrorCodeDeveloperUsageCreditExhausted case ErrorResponseErrorCodeNoPayoutAddress: @@ -27896,6 +27916,456 @@ func (s *GetStorageStatsUnauthorized) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode encodes GetTemplateBadRequest as json. +func (s *GetTemplateBadRequest) Encode(e *jx.Encoder) { + unwrapped := (*ErrorResponse)(s) + + unwrapped.Encode(e) +} + +// Decode decodes GetTemplateBadRequest from json. +func (s *GetTemplateBadRequest) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode GetTemplateBadRequest to nil") + } + var unwrapped ErrorResponse + if err := func() error { + if err := unwrapped.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = GetTemplateBadRequest(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *GetTemplateBadRequest) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *GetTemplateBadRequest) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes GetTemplateInstallBadRequest as json. +func (s *GetTemplateInstallBadRequest) Encode(e *jx.Encoder) { + unwrapped := (*ErrorResponse)(s) + + unwrapped.Encode(e) +} + +// Decode decodes GetTemplateInstallBadRequest from json. +func (s *GetTemplateInstallBadRequest) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode GetTemplateInstallBadRequest to nil") + } + var unwrapped ErrorResponse + if err := func() error { + if err := unwrapped.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = GetTemplateInstallBadRequest(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *GetTemplateInstallBadRequest) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *GetTemplateInstallBadRequest) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes GetTemplateInstallForbidden as json. +func (s *GetTemplateInstallForbidden) Encode(e *jx.Encoder) { + unwrapped := (*ErrorResponse)(s) + + unwrapped.Encode(e) +} + +// Decode decodes GetTemplateInstallForbidden from json. +func (s *GetTemplateInstallForbidden) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode GetTemplateInstallForbidden to nil") + } + var unwrapped ErrorResponse + if err := func() error { + if err := unwrapped.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = GetTemplateInstallForbidden(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *GetTemplateInstallForbidden) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *GetTemplateInstallForbidden) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes GetTemplateInstallNotFound as json. +func (s *GetTemplateInstallNotFound) Encode(e *jx.Encoder) { + unwrapped := (*ErrorResponse)(s) + + unwrapped.Encode(e) +} + +// Decode decodes GetTemplateInstallNotFound from json. +func (s *GetTemplateInstallNotFound) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode GetTemplateInstallNotFound to nil") + } + var unwrapped ErrorResponse + if err := func() error { + if err := unwrapped.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = GetTemplateInstallNotFound(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *GetTemplateInstallNotFound) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *GetTemplateInstallNotFound) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *GetTemplateInstallOK) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *GetTemplateInstallOK) encodeFields(e *jx.Encoder) { + { + e.FieldStart("success") + e.Bool(true) + } + { + e.FieldStart("data") + s.Data.Encode(e) + } +} + +var jsonFieldsNameOfGetTemplateInstallOK = [2]string{ + 0: "success", + 1: "data", +} + +// Decode decodes GetTemplateInstallOK from json. +func (s *GetTemplateInstallOK) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode GetTemplateInstallOK to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "success": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Bool() + s.Success = bool(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"success\"") + } + case "data": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + if err := s.Data.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"data\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode GetTemplateInstallOK") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfGetTemplateInstallOK) { + name = jsonFieldsNameOfGetTemplateInstallOK[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *GetTemplateInstallOK) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *GetTemplateInstallOK) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes GetTemplateInstallUnauthorized as json. +func (s *GetTemplateInstallUnauthorized) Encode(e *jx.Encoder) { + unwrapped := (*ErrorResponse)(s) + + unwrapped.Encode(e) +} + +// Decode decodes GetTemplateInstallUnauthorized from json. +func (s *GetTemplateInstallUnauthorized) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode GetTemplateInstallUnauthorized to nil") + } + var unwrapped ErrorResponse + if err := func() error { + if err := unwrapped.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = GetTemplateInstallUnauthorized(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *GetTemplateInstallUnauthorized) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *GetTemplateInstallUnauthorized) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes GetTemplateNotFound as json. +func (s *GetTemplateNotFound) Encode(e *jx.Encoder) { + unwrapped := (*ErrorResponse)(s) + + unwrapped.Encode(e) +} + +// Decode decodes GetTemplateNotFound from json. +func (s *GetTemplateNotFound) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode GetTemplateNotFound to nil") + } + var unwrapped ErrorResponse + if err := func() error { + if err := unwrapped.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = GetTemplateNotFound(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *GetTemplateNotFound) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *GetTemplateNotFound) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *GetTemplateOK) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *GetTemplateOK) encodeFields(e *jx.Encoder) { + { + e.FieldStart("success") + e.Bool(true) + } + { + e.FieldStart("data") + s.Data.Encode(e) + } +} + +var jsonFieldsNameOfGetTemplateOK = [2]string{ + 0: "success", + 1: "data", +} + +// Decode decodes GetTemplateOK from json. +func (s *GetTemplateOK) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode GetTemplateOK to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "success": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Bool() + s.Success = bool(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"success\"") + } + case "data": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + if err := s.Data.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"data\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode GetTemplateOK") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfGetTemplateOK) { + name = jsonFieldsNameOfGetTemplateOK[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *GetTemplateOK) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *GetTemplateOK) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode encodes GetThreadBadRequest as json. func (s *GetThreadBadRequest) Encode(e *jx.Encoder) { unwrapped := (*ErrorResponse)(s) @@ -29730,6 +30200,571 @@ func (s *InboxStatusRecentEmailSummary) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode encodes InstallTemplateBadRequest as json. +func (s *InstallTemplateBadRequest) Encode(e *jx.Encoder) { + unwrapped := (*ErrorResponse)(s) + + unwrapped.Encode(e) +} + +// Decode decodes InstallTemplateBadRequest from json. +func (s *InstallTemplateBadRequest) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode InstallTemplateBadRequest to nil") + } + var unwrapped ErrorResponse + if err := func() error { + if err := unwrapped.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = InstallTemplateBadRequest(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *InstallTemplateBadRequest) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *InstallTemplateBadRequest) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *InstallTemplateBody) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *InstallTemplateBody) encodeFields(e *jx.Encoder) { + { + if s.Address.Set { + e.FieldStart("address") + s.Address.Encode(e) + } + } + { + if s.Domain.Set { + e.FieldStart("domain") + s.Domain.Encode(e) + } + } + { + if s.Variables.Set { + e.FieldStart("variables") + s.Variables.Encode(e) + } + } + { + if s.Secrets.Set { + e.FieldStart("secrets") + s.Secrets.Encode(e) + } + } +} + +var jsonFieldsNameOfInstallTemplateBody = [4]string{ + 0: "address", + 1: "domain", + 2: "variables", + 3: "secrets", +} + +// Decode decodes InstallTemplateBody from json. +func (s *InstallTemplateBody) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode InstallTemplateBody to nil") + } + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "address": + if err := func() error { + s.Address.Reset() + if err := s.Address.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"address\"") + } + case "domain": + if err := func() error { + s.Domain.Reset() + if err := s.Domain.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"domain\"") + } + case "variables": + if err := func() error { + s.Variables.Reset() + if err := s.Variables.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"variables\"") + } + case "secrets": + if err := func() error { + s.Secrets.Reset() + if err := s.Secrets.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"secrets\"") + } + default: + return errors.Errorf("unexpected field %q", k) + } + return nil + }); err != nil { + return errors.Wrap(err, "decode InstallTemplateBody") + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *InstallTemplateBody) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *InstallTemplateBody) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s InstallTemplateBodySecrets) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields implements json.Marshaler. +func (s InstallTemplateBodySecrets) encodeFields(e *jx.Encoder) { + for k, elem := range s { + e.FieldStart(k) + + e.Str(elem) + } +} + +// Decode decodes InstallTemplateBodySecrets from json. +func (s *InstallTemplateBodySecrets) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode InstallTemplateBodySecrets to nil") + } + m := s.init() + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + var elem string + if err := func() error { + v, err := d.Str() + elem = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrapf(err, "decode field %q", k) + } + m[string(k)] = elem + return nil + }); err != nil { + return errors.Wrap(err, "decode InstallTemplateBodySecrets") + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s InstallTemplateBodySecrets) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *InstallTemplateBodySecrets) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s InstallTemplateBodyVariables) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields implements json.Marshaler. +func (s InstallTemplateBodyVariables) encodeFields(e *jx.Encoder) { + for k, elem := range s { + e.FieldStart(k) + + e.Str(elem) + } +} + +// Decode decodes InstallTemplateBodyVariables from json. +func (s *InstallTemplateBodyVariables) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode InstallTemplateBodyVariables to nil") + } + m := s.init() + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + var elem string + if err := func() error { + v, err := d.Str() + elem = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrapf(err, "decode field %q", k) + } + m[string(k)] = elem + return nil + }); err != nil { + return errors.Wrap(err, "decode InstallTemplateBodyVariables") + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s InstallTemplateBodyVariables) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *InstallTemplateBodyVariables) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes InstallTemplateConflict as json. +func (s *InstallTemplateConflict) Encode(e *jx.Encoder) { + unwrapped := (*ErrorResponse)(s) + + unwrapped.Encode(e) +} + +// Decode decodes InstallTemplateConflict from json. +func (s *InstallTemplateConflict) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode InstallTemplateConflict to nil") + } + var unwrapped ErrorResponse + if err := func() error { + if err := unwrapped.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = InstallTemplateConflict(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *InstallTemplateConflict) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *InstallTemplateConflict) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *InstallTemplateCreated) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *InstallTemplateCreated) encodeFields(e *jx.Encoder) { + { + e.FieldStart("success") + e.Bool(true) + } + { + e.FieldStart("data") + s.Data.Encode(e) + } +} + +var jsonFieldsNameOfInstallTemplateCreated = [2]string{ + 0: "success", + 1: "data", +} + +// Decode decodes InstallTemplateCreated from json. +func (s *InstallTemplateCreated) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode InstallTemplateCreated to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "success": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Bool() + s.Success = bool(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"success\"") + } + case "data": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + if err := s.Data.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"data\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode InstallTemplateCreated") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfInstallTemplateCreated) { + name = jsonFieldsNameOfInstallTemplateCreated[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *InstallTemplateCreated) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *InstallTemplateCreated) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes InstallTemplateForbidden as json. +func (s *InstallTemplateForbidden) Encode(e *jx.Encoder) { + unwrapped := (*ErrorResponse)(s) + + unwrapped.Encode(e) +} + +// Decode decodes InstallTemplateForbidden from json. +func (s *InstallTemplateForbidden) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode InstallTemplateForbidden to nil") + } + var unwrapped ErrorResponse + if err := func() error { + if err := unwrapped.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = InstallTemplateForbidden(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *InstallTemplateForbidden) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *InstallTemplateForbidden) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes InstallTemplateNotFound as json. +func (s *InstallTemplateNotFound) Encode(e *jx.Encoder) { + unwrapped := (*ErrorResponse)(s) + + unwrapped.Encode(e) +} + +// Decode decodes InstallTemplateNotFound from json. +func (s *InstallTemplateNotFound) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode InstallTemplateNotFound to nil") + } + var unwrapped ErrorResponse + if err := func() error { + if err := unwrapped.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = InstallTemplateNotFound(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *InstallTemplateNotFound) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *InstallTemplateNotFound) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes InstallTemplateUnauthorized as json. +func (s *InstallTemplateUnauthorized) Encode(e *jx.Encoder) { + unwrapped := (*ErrorResponse)(s) + + unwrapped.Encode(e) +} + +// Decode decodes InstallTemplateUnauthorized from json. +func (s *InstallTemplateUnauthorized) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode InstallTemplateUnauthorized to nil") + } + var unwrapped ErrorResponse + if err := func() error { + if err := unwrapped.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = InstallTemplateUnauthorized(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *InstallTemplateUnauthorized) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *InstallTemplateUnauthorized) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes InstallTemplateUnprocessableEntity as json. +func (s *InstallTemplateUnprocessableEntity) Encode(e *jx.Encoder) { + unwrapped := (*ErrorResponse)(s) + + unwrapped.Encode(e) +} + +// Decode decodes InstallTemplateUnprocessableEntity from json. +func (s *InstallTemplateUnprocessableEntity) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode InstallTemplateUnprocessableEntity to nil") + } + var unwrapped ErrorResponse + if err := func() error { + if err := unwrapped.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = InstallTemplateUnprocessableEntity(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *InstallTemplateUnprocessableEntity) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *InstallTemplateUnprocessableEntity) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode encodes ListDeclinedPaymentsForbidden as json. func (s *ListDeclinedPaymentsForbidden) Encode(e *jx.Encoder) { unwrapped := (*ErrorResponse)(s) @@ -32739,6 +33774,117 @@ func (s *ListSentEmailsUnauthorized) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode implements json.Marshaler. +func (s *ListTemplatesOK) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *ListTemplatesOK) encodeFields(e *jx.Encoder) { + { + e.FieldStart("success") + e.Bool(true) + } + { + e.FieldStart("data") + s.Data.Encode(e) + } +} + +var jsonFieldsNameOfListTemplatesOK = [2]string{ + 0: "success", + 1: "data", +} + +// Decode decodes ListTemplatesOK from json. +func (s *ListTemplatesOK) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ListTemplatesOK to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "success": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Bool() + s.Success = bool(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"success\"") + } + case "data": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + if err := s.Data.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"data\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode ListTemplatesOK") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfListTemplatesOK) { + name = jsonFieldsNameOfListTemplatesOK[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *ListTemplatesOK) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ListTemplatesOK) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode encodes ListWakeAuthorizationsBadRequest as json. func (s *ListWakeAuthorizationsBadRequest) Encode(e *jx.Encoder) { unwrapped := (*ErrorResponse)(s) @@ -35783,6 +36929,74 @@ func (s *OptGateFix) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode encodes InstallTemplateBodySecrets as json. +func (o OptInstallTemplateBodySecrets) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes InstallTemplateBodySecrets from json. +func (o *OptInstallTemplateBodySecrets) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptInstallTemplateBodySecrets to nil") + } + o.Set = true + o.Value = make(InstallTemplateBodySecrets) + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptInstallTemplateBodySecrets) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptInstallTemplateBodySecrets) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes InstallTemplateBodyVariables as json. +func (o OptInstallTemplateBodyVariables) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes InstallTemplateBodyVariables from json. +func (o *OptInstallTemplateBodyVariables) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptInstallTemplateBodyVariables to nil") + } + o.Set = true + o.Value = make(InstallTemplateBodyVariables) + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptInstallTemplateBodyVariables) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptInstallTemplateBodyVariables) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode encodes int as json. func (o OptInt) Encode(e *jx.Encoder) { if !o.Set { @@ -37019,6 +38233,72 @@ func (s *OptString) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode encodes TemplateSetup as json. +func (o OptTemplateSetup) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes TemplateSetup from json. +func (o *OptTemplateSetup) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptTemplateSetup to nil") + } + o.Set = true + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptTemplateSetup) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptTemplateSetup) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes TemplateVariableValidation as json. +func (o OptTemplateVariableValidation) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes TemplateVariableValidation from json. +func (o *OptTemplateVariableValidation) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptTemplateVariableValidation to nil") + } + o.Set = true + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptTemplateVariableValidation) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptTemplateVariableValidation) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode encodes TestFunctionReq as json. func (o OptTestFunctionReq) Encode(e *jx.Encoder) { if !o.Set { @@ -53987,6 +55267,2811 @@ func (s *StorageStats) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode implements json.Marshaler. +func (s *TemplateAuthor) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *TemplateAuthor) encodeFields(e *jx.Encoder) { + { + e.FieldStart("id") + e.Str(s.ID) + } + { + e.FieldStart("name") + e.Str(s.Name) + } + { + if s.URL.Set { + e.FieldStart("url") + s.URL.Encode(e) + } + } +} + +var jsonFieldsNameOfTemplateAuthor = [3]string{ + 0: "id", + 1: "name", + 2: "url", +} + +// Decode decodes TemplateAuthor from json. +func (s *TemplateAuthor) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateAuthor to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "id": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.ID = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"id\"") + } + case "name": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.Name = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"name\"") + } + case "url": + if err := func() error { + s.URL.Reset() + if err := s.URL.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"url\"") + } + default: + return errors.Errorf("unexpected field %q", k) + } + return nil + }); err != nil { + return errors.Wrap(err, "decode TemplateAuthor") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfTemplateAuthor) { + name = jsonFieldsNameOfTemplateAuthor[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *TemplateAuthor) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateAuthor) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *TemplateInstall) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *TemplateInstall) encodeFields(e *jx.Encoder) { + { + e.FieldStart("mode") + s.Mode.Encode(e) + } + { + e.FieldStart("editFiles") + e.ArrStart() + for _, elem := range s.EditFiles { + e.Str(elem) + } + e.ArrEnd() + } + { + e.FieldStart("reason") + e.Str(s.Reason) + } +} + +var jsonFieldsNameOfTemplateInstall = [3]string{ + 0: "mode", + 1: "editFiles", + 2: "reason", +} + +// Decode decodes TemplateInstall from json. +func (s *TemplateInstall) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateInstall to nil") + } + var requiredBitSet [1]uint8 + s.setDefaults() + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "mode": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.Mode.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"mode\"") + } + case "editFiles": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + s.EditFiles = make([]string, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem string + v, err := d.Str() + elem = string(v) + if err != nil { + return err + } + s.EditFiles = append(s.EditFiles, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"editFiles\"") + } + case "reason": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + v, err := d.Str() + s.Reason = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"reason\"") + } + default: + return errors.Errorf("unexpected field %q", k) + } + return nil + }); err != nil { + return errors.Wrap(err, "decode TemplateInstall") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000111, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfTemplateInstall) { + name = jsonFieldsNameOfTemplateInstall[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *TemplateInstall) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateInstall) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes TemplateInstallMode as json. +func (s TemplateInstallMode) Encode(e *jx.Encoder) { + e.Str(string(s)) +} + +// Decode decodes TemplateInstallMode from json. +func (s *TemplateInstallMode) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateInstallMode to nil") + } + v, err := d.StrBytes() + if err != nil { + return err + } + // Try to use constant string. + switch TemplateInstallMode(v) { + case TemplateInstallModeDeploy: + *s = TemplateInstallModeDeploy + case TemplateInstallModeScaffold: + *s = TemplateInstallModeScaffold + default: + *s = TemplateInstallMode(v) + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s TemplateInstallMode) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateInstallMode) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes TemplateInstallState as json. +func (s TemplateInstallState) Encode(e *jx.Encoder) { + e.Str(string(s)) +} + +// Decode decodes TemplateInstallState from json. +func (s *TemplateInstallState) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateInstallState to nil") + } + v, err := d.StrBytes() + if err != nil { + return err + } + // Try to use constant string. + switch TemplateInstallState(v) { + case TemplateInstallStateDeploying: + *s = TemplateInstallStateDeploying + case TemplateInstallStateConnecting: + *s = TemplateInstallStateConnecting + case TemplateInstallStateBound: + *s = TemplateInstallStateBound + case TemplateInstallStateTested: + *s = TemplateInstallStateTested + case TemplateInstallStateDeployFailed: + *s = TemplateInstallStateDeployFailed + case TemplateInstallStateBindFailed: + *s = TemplateInstallStateBindFailed + case TemplateInstallStateTestFailed: + *s = TemplateInstallStateTestFailed + default: + *s = TemplateInstallState(v) + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s TemplateInstallState) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateInstallState) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *TemplateInstallStatus) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *TemplateInstallStatus) encodeFields(e *jx.Encoder) { + { + e.FieldStart("id") + json.EncodeUUID(e, s.ID) + } + { + e.FieldStart("template_slug") + e.Str(s.TemplateSlug) + } + { + e.FieldStart("state") + s.State.Encode(e) + } + { + e.FieldStart("address") + s.Address.Encode(e) + } + { + e.FieldStart("function_id") + s.FunctionID.Encode(e) + } + { + e.FieldStart("error") + s.Error.Encode(e) + } + { + e.FieldStart("created_at") + json.EncodeDateTime(e, s.CreatedAt) + } + { + e.FieldStart("updated_at") + json.EncodeDateTime(e, s.UpdatedAt) + } +} + +var jsonFieldsNameOfTemplateInstallStatus = [8]string{ + 0: "id", + 1: "template_slug", + 2: "state", + 3: "address", + 4: "function_id", + 5: "error", + 6: "created_at", + 7: "updated_at", +} + +// Decode decodes TemplateInstallStatus from json. +func (s *TemplateInstallStatus) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateInstallStatus to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "id": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := json.DecodeUUID(d) + s.ID = v + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"id\"") + } + case "template_slug": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.TemplateSlug = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"template_slug\"") + } + case "state": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + if err := s.State.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"state\"") + } + case "address": + requiredBitSet[0] |= 1 << 3 + if err := func() error { + if err := s.Address.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"address\"") + } + case "function_id": + requiredBitSet[0] |= 1 << 4 + if err := func() error { + if err := s.FunctionID.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"function_id\"") + } + case "error": + requiredBitSet[0] |= 1 << 5 + if err := func() error { + if err := s.Error.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"error\"") + } + case "created_at": + requiredBitSet[0] |= 1 << 6 + if err := func() error { + v, err := json.DecodeDateTime(d) + s.CreatedAt = v + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"created_at\"") + } + case "updated_at": + requiredBitSet[0] |= 1 << 7 + if err := func() error { + v, err := json.DecodeDateTime(d) + s.UpdatedAt = v + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"updated_at\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode TemplateInstallStatus") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b11111111, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfTemplateInstallStatus) { + name = jsonFieldsNameOfTemplateInstallStatus[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *TemplateInstallStatus) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateInstallStatus) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *TemplateManifest) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *TemplateManifest) encodeFields(e *jx.Encoder) { + { + e.FieldStart("schemaVersion") + e.Int(1) + } + { + e.FieldStart("id") + e.Str(s.ID) + } + { + e.FieldStart("title") + e.Str(s.Title) + } + { + e.FieldStart("summary") + e.Str(s.Summary) + } + { + if s.Description.Set { + e.FieldStart("description") + s.Description.Encode(e) + } + } + { + e.FieldStart("author") + s.Author.Encode(e) + } + { + e.FieldStart("tags") + e.ArrStart() + for _, elem := range s.Tags { + e.Str(elem) + } + e.ArrEnd() + } + { + e.FieldStart("source") + s.Source.Encode(e) + } + { + e.FieldStart("install") + s.Install.Encode(e) + } + { + e.FieldStart("secrets") + e.ArrStart() + for _, elem := range s.Secrets { + elem.Encode(e) + } + e.ArrEnd() + } + { + e.FieldStart("secretGroups") + e.ArrStart() + for _, elem := range s.SecretGroups { + elem.Encode(e) + } + e.ArrEnd() + } + { + e.FieldStart("variables") + e.ArrStart() + for _, elem := range s.Variables { + elem.Encode(e) + } + e.ArrEnd() + } + { + if s.Setup.Set { + e.FieldStart("setup") + s.Setup.Encode(e) + } + } + { + if s.PostInstall.Set { + e.FieldStart("postInstall") + s.PostInstall.Encode(e) + } + } +} + +var jsonFieldsNameOfTemplateManifest = [14]string{ + 0: "schemaVersion", + 1: "id", + 2: "title", + 3: "summary", + 4: "description", + 5: "author", + 6: "tags", + 7: "source", + 8: "install", + 9: "secrets", + 10: "secretGroups", + 11: "variables", + 12: "setup", + 13: "postInstall", +} + +// Decode decodes TemplateManifest from json. +func (s *TemplateManifest) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateManifest to nil") + } + var requiredBitSet [2]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "schemaVersion": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Int() + s.SchemaVersion = int(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"schemaVersion\"") + } + case "id": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.ID = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"id\"") + } + case "title": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + v, err := d.Str() + s.Title = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"title\"") + } + case "summary": + requiredBitSet[0] |= 1 << 3 + if err := func() error { + v, err := d.Str() + s.Summary = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"summary\"") + } + case "description": + if err := func() error { + s.Description.Reset() + if err := s.Description.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"description\"") + } + case "author": + requiredBitSet[0] |= 1 << 5 + if err := func() error { + if err := s.Author.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"author\"") + } + case "tags": + requiredBitSet[0] |= 1 << 6 + if err := func() error { + s.Tags = make([]string, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem string + v, err := d.Str() + elem = string(v) + if err != nil { + return err + } + s.Tags = append(s.Tags, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"tags\"") + } + case "source": + requiredBitSet[0] |= 1 << 7 + if err := func() error { + if err := s.Source.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"source\"") + } + case "install": + requiredBitSet[1] |= 1 << 0 + if err := func() error { + if err := s.Install.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"install\"") + } + case "secrets": + requiredBitSet[1] |= 1 << 1 + if err := func() error { + s.Secrets = make([]TemplateSecret, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem TemplateSecret + if err := elem.Decode(d); err != nil { + return err + } + s.Secrets = append(s.Secrets, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"secrets\"") + } + case "secretGroups": + requiredBitSet[1] |= 1 << 2 + if err := func() error { + s.SecretGroups = make([]TemplateSecretGroup, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem TemplateSecretGroup + if err := elem.Decode(d); err != nil { + return err + } + s.SecretGroups = append(s.SecretGroups, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"secretGroups\"") + } + case "variables": + requiredBitSet[1] |= 1 << 3 + if err := func() error { + s.Variables = make([]TemplateVariable, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem TemplateVariable + if err := elem.Decode(d); err != nil { + return err + } + s.Variables = append(s.Variables, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"variables\"") + } + case "setup": + if err := func() error { + s.Setup.Reset() + if err := s.Setup.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"setup\"") + } + case "postInstall": + if err := func() error { + s.PostInstall.Reset() + if err := s.PostInstall.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"postInstall\"") + } + default: + return errors.Errorf("unexpected field %q", k) + } + return nil + }); err != nil { + return errors.Wrap(err, "decode TemplateManifest") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [2]uint8{ + 0b11101111, + 0b00001111, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfTemplateManifest) { + name = jsonFieldsNameOfTemplateManifest[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *TemplateManifest) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateManifest) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *TemplateRegistryDetail) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *TemplateRegistryDetail) encodeFields(e *jx.Encoder) { + { + e.FieldStart("id") + json.EncodeUUID(e, s.ID) + } + { + e.FieldStart("slug") + e.Str(s.Slug) + } + { + e.FieldStart("title") + e.Str(s.Title) + } + { + e.FieldStart("summary") + e.Str(s.Summary) + } + { + e.FieldStart("author") + s.Author.Encode(e) + } + { + e.FieldStart("tags") + e.ArrStart() + for _, elem := range s.Tags { + e.Str(elem) + } + e.ArrEnd() + } + { + e.FieldStart("verified") + e.Bool(s.Verified) + } + { + e.FieldStart("install_count") + e.Int(s.InstallCount) + } + { + e.FieldStart("github_repo") + e.Str(s.GithubRepo) + } + { + e.FieldStart("created_at") + json.EncodeDateTime(e, s.CreatedAt) + } + { + e.FieldStart("updated_at") + json.EncodeDateTime(e, s.UpdatedAt) + } + { + e.FieldStart("description") + s.Description.Encode(e) + } + { + e.FieldStart("github_sha") + e.Str(s.GithubSha) + } + { + e.FieldStart("github_path") + s.GithubPath.Encode(e) + } + { + e.FieldStart("manifest") + s.Manifest.Encode(e) + } + { + e.FieldStart("readme") + s.Readme.Encode(e) + } + { + e.FieldStart("status") + s.Status.Encode(e) + } +} + +var jsonFieldsNameOfTemplateRegistryDetail = [17]string{ + 0: "id", + 1: "slug", + 2: "title", + 3: "summary", + 4: "author", + 5: "tags", + 6: "verified", + 7: "install_count", + 8: "github_repo", + 9: "created_at", + 10: "updated_at", + 11: "description", + 12: "github_sha", + 13: "github_path", + 14: "manifest", + 15: "readme", + 16: "status", +} + +// Decode decodes TemplateRegistryDetail from json. +func (s *TemplateRegistryDetail) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateRegistryDetail to nil") + } + var requiredBitSet [3]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "id": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := json.DecodeUUID(d) + s.ID = v + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"id\"") + } + case "slug": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.Slug = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"slug\"") + } + case "title": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + v, err := d.Str() + s.Title = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"title\"") + } + case "summary": + requiredBitSet[0] |= 1 << 3 + if err := func() error { + v, err := d.Str() + s.Summary = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"summary\"") + } + case "author": + requiredBitSet[0] |= 1 << 4 + if err := func() error { + if err := s.Author.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"author\"") + } + case "tags": + requiredBitSet[0] |= 1 << 5 + if err := func() error { + s.Tags = make([]string, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem string + v, err := d.Str() + elem = string(v) + if err != nil { + return err + } + s.Tags = append(s.Tags, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"tags\"") + } + case "verified": + requiredBitSet[0] |= 1 << 6 + if err := func() error { + v, err := d.Bool() + s.Verified = bool(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"verified\"") + } + case "install_count": + requiredBitSet[0] |= 1 << 7 + if err := func() error { + v, err := d.Int() + s.InstallCount = int(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"install_count\"") + } + case "github_repo": + requiredBitSet[1] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.GithubRepo = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"github_repo\"") + } + case "created_at": + requiredBitSet[1] |= 1 << 1 + if err := func() error { + v, err := json.DecodeDateTime(d) + s.CreatedAt = v + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"created_at\"") + } + case "updated_at": + requiredBitSet[1] |= 1 << 2 + if err := func() error { + v, err := json.DecodeDateTime(d) + s.UpdatedAt = v + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"updated_at\"") + } + case "description": + requiredBitSet[1] |= 1 << 3 + if err := func() error { + if err := s.Description.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"description\"") + } + case "github_sha": + requiredBitSet[1] |= 1 << 4 + if err := func() error { + v, err := d.Str() + s.GithubSha = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"github_sha\"") + } + case "github_path": + requiredBitSet[1] |= 1 << 5 + if err := func() error { + if err := s.GithubPath.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"github_path\"") + } + case "manifest": + requiredBitSet[1] |= 1 << 6 + if err := func() error { + if err := s.Manifest.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"manifest\"") + } + case "readme": + requiredBitSet[1] |= 1 << 7 + if err := func() error { + if err := s.Readme.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"readme\"") + } + case "status": + requiredBitSet[2] |= 1 << 0 + if err := func() error { + if err := s.Status.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"status\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode TemplateRegistryDetail") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [3]uint8{ + 0b11111111, + 0b11111111, + 0b00000001, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfTemplateRegistryDetail) { + name = jsonFieldsNameOfTemplateRegistryDetail[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *TemplateRegistryDetail) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateRegistryDetail) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *TemplateRegistryPage) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *TemplateRegistryPage) encodeFields(e *jx.Encoder) { + { + e.FieldStart("items") + e.ArrStart() + for _, elem := range s.Items { + elem.Encode(e) + } + e.ArrEnd() + } + { + e.FieldStart("next_cursor") + s.NextCursor.Encode(e) + } +} + +var jsonFieldsNameOfTemplateRegistryPage = [2]string{ + 0: "items", + 1: "next_cursor", +} + +// Decode decodes TemplateRegistryPage from json. +func (s *TemplateRegistryPage) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateRegistryPage to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "items": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + s.Items = make([]TemplateRegistrySummary, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem TemplateRegistrySummary + if err := elem.Decode(d); err != nil { + return err + } + s.Items = append(s.Items, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"items\"") + } + case "next_cursor": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + if err := s.NextCursor.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"next_cursor\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode TemplateRegistryPage") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfTemplateRegistryPage) { + name = jsonFieldsNameOfTemplateRegistryPage[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *TemplateRegistryPage) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateRegistryPage) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes TemplateRegistryStatus as json. +func (s TemplateRegistryStatus) Encode(e *jx.Encoder) { + e.Str(string(s)) +} + +// Decode decodes TemplateRegistryStatus from json. +func (s *TemplateRegistryStatus) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateRegistryStatus to nil") + } + v, err := d.StrBytes() + if err != nil { + return err + } + // Try to use constant string. + switch TemplateRegistryStatus(v) { + case TemplateRegistryStatusPending: + *s = TemplateRegistryStatusPending + case TemplateRegistryStatusApproved: + *s = TemplateRegistryStatusApproved + case TemplateRegistryStatusRejected: + *s = TemplateRegistryStatusRejected + default: + *s = TemplateRegistryStatus(v) + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s TemplateRegistryStatus) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateRegistryStatus) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *TemplateRegistrySummary) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *TemplateRegistrySummary) encodeFields(e *jx.Encoder) { + { + e.FieldStart("id") + json.EncodeUUID(e, s.ID) + } + { + e.FieldStart("slug") + e.Str(s.Slug) + } + { + e.FieldStart("title") + e.Str(s.Title) + } + { + e.FieldStart("summary") + e.Str(s.Summary) + } + { + e.FieldStart("author") + s.Author.Encode(e) + } + { + e.FieldStart("tags") + e.ArrStart() + for _, elem := range s.Tags { + e.Str(elem) + } + e.ArrEnd() + } + { + e.FieldStart("verified") + e.Bool(s.Verified) + } + { + e.FieldStart("install_count") + e.Int(s.InstallCount) + } + { + e.FieldStart("github_repo") + e.Str(s.GithubRepo) + } + { + e.FieldStart("created_at") + json.EncodeDateTime(e, s.CreatedAt) + } + { + e.FieldStart("updated_at") + json.EncodeDateTime(e, s.UpdatedAt) + } +} + +var jsonFieldsNameOfTemplateRegistrySummary = [11]string{ + 0: "id", + 1: "slug", + 2: "title", + 3: "summary", + 4: "author", + 5: "tags", + 6: "verified", + 7: "install_count", + 8: "github_repo", + 9: "created_at", + 10: "updated_at", +} + +// Decode decodes TemplateRegistrySummary from json. +func (s *TemplateRegistrySummary) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateRegistrySummary to nil") + } + var requiredBitSet [2]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "id": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := json.DecodeUUID(d) + s.ID = v + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"id\"") + } + case "slug": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.Slug = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"slug\"") + } + case "title": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + v, err := d.Str() + s.Title = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"title\"") + } + case "summary": + requiredBitSet[0] |= 1 << 3 + if err := func() error { + v, err := d.Str() + s.Summary = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"summary\"") + } + case "author": + requiredBitSet[0] |= 1 << 4 + if err := func() error { + if err := s.Author.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"author\"") + } + case "tags": + requiredBitSet[0] |= 1 << 5 + if err := func() error { + s.Tags = make([]string, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem string + v, err := d.Str() + elem = string(v) + if err != nil { + return err + } + s.Tags = append(s.Tags, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"tags\"") + } + case "verified": + requiredBitSet[0] |= 1 << 6 + if err := func() error { + v, err := d.Bool() + s.Verified = bool(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"verified\"") + } + case "install_count": + requiredBitSet[0] |= 1 << 7 + if err := func() error { + v, err := d.Int() + s.InstallCount = int(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"install_count\"") + } + case "github_repo": + requiredBitSet[1] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.GithubRepo = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"github_repo\"") + } + case "created_at": + requiredBitSet[1] |= 1 << 1 + if err := func() error { + v, err := json.DecodeDateTime(d) + s.CreatedAt = v + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"created_at\"") + } + case "updated_at": + requiredBitSet[1] |= 1 << 2 + if err := func() error { + v, err := json.DecodeDateTime(d) + s.UpdatedAt = v + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"updated_at\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode TemplateRegistrySummary") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [2]uint8{ + 0b11111111, + 0b00000111, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfTemplateRegistrySummary) { + name = jsonFieldsNameOfTemplateRegistrySummary[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *TemplateRegistrySummary) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateRegistrySummary) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *TemplateSecret) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *TemplateSecret) encodeFields(e *jx.Encoder) { + { + e.FieldStart("key") + e.Str(s.Key) + } + { + e.FieldStart("required") + e.Bool(s.Required) + } + { + if s.Description.Set { + e.FieldStart("description") + s.Description.Encode(e) + } + } +} + +var jsonFieldsNameOfTemplateSecret = [3]string{ + 0: "key", + 1: "required", + 2: "description", +} + +// Decode decodes TemplateSecret from json. +func (s *TemplateSecret) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateSecret to nil") + } + var requiredBitSet [1]uint8 + s.setDefaults() + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "key": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.Key = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"key\"") + } + case "required": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Bool() + s.Required = bool(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"required\"") + } + case "description": + if err := func() error { + s.Description.Reset() + if err := s.Description.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"description\"") + } + default: + return errors.Errorf("unexpected field %q", k) + } + return nil + }); err != nil { + return errors.Wrap(err, "decode TemplateSecret") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfTemplateSecret) { + name = jsonFieldsNameOfTemplateSecret[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *TemplateSecret) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateSecret) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *TemplateSecretGroup) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *TemplateSecretGroup) encodeFields(e *jx.Encoder) { + { + e.FieldStart("keys") + e.ArrStart() + for _, elem := range s.Keys { + e.Str(elem) + } + e.ArrEnd() + } + { + e.FieldStart("min") + e.Int(s.Min) + } + { + if s.Description.Set { + e.FieldStart("description") + s.Description.Encode(e) + } + } +} + +var jsonFieldsNameOfTemplateSecretGroup = [3]string{ + 0: "keys", + 1: "min", + 2: "description", +} + +// Decode decodes TemplateSecretGroup from json. +func (s *TemplateSecretGroup) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateSecretGroup to nil") + } + var requiredBitSet [1]uint8 + s.setDefaults() + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "keys": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + s.Keys = make([]string, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem string + v, err := d.Str() + elem = string(v) + if err != nil { + return err + } + s.Keys = append(s.Keys, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"keys\"") + } + case "min": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Int() + s.Min = int(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"min\"") + } + case "description": + if err := func() error { + s.Description.Reset() + if err := s.Description.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"description\"") + } + default: + return errors.Errorf("unexpected field %q", k) + } + return nil + }); err != nil { + return errors.Wrap(err, "decode TemplateSecretGroup") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfTemplateSecretGroup) { + name = jsonFieldsNameOfTemplateSecretGroup[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *TemplateSecretGroup) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateSecretGroup) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *TemplateSetup) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *TemplateSetup) encodeFields(e *jx.Encoder) { + { + e.FieldStart("agent") + e.Str(s.Agent) + } + { + e.FieldStart("prompt") + e.Str(s.Prompt) + } + { + e.FieldStart("produces") + e.ArrStart() + for _, elem := range s.Produces { + e.Str(elem) + } + e.ArrEnd() + } +} + +var jsonFieldsNameOfTemplateSetup = [3]string{ + 0: "agent", + 1: "prompt", + 2: "produces", +} + +// Decode decodes TemplateSetup from json. +func (s *TemplateSetup) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateSetup to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "agent": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.Agent = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"agent\"") + } + case "prompt": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.Prompt = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"prompt\"") + } + case "produces": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + s.Produces = make([]string, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem string + v, err := d.Str() + elem = string(v) + if err != nil { + return err + } + s.Produces = append(s.Produces, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"produces\"") + } + default: + return errors.Errorf("unexpected field %q", k) + } + return nil + }); err != nil { + return errors.Wrap(err, "decode TemplateSetup") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000111, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfTemplateSetup) { + name = jsonFieldsNameOfTemplateSetup[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *TemplateSetup) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateSetup) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes TemplateSource as json. +func (s TemplateSource) Encode(e *jx.Encoder) { + switch s.Type { + case TemplateSource0TemplateSource: + s.TemplateSource0.Encode(e) + case TemplateSource1TemplateSource: + s.TemplateSource1.Encode(e) + } +} + +func (s TemplateSource) encodeFields(e *jx.Encoder) { + switch s.Type { + case TemplateSource0TemplateSource: + s.TemplateSource0.encodeFields(e) + case TemplateSource1TemplateSource: + s.TemplateSource1.encodeFields(e) + } +} + +// Decode decodes TemplateSource from json. +func (s *TemplateSource) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateSource to nil") + } + // Sum type fields. + if typ := d.Next(); typ != jx.Object { + return errors.Errorf("unexpected json type %q", typ) + } + + var found bool + if err := d.Capture(func(d *jx.Decoder) error { + return d.ObjBytes(func(d *jx.Decoder, key []byte) error { + switch string(key) { + case "dir": + // Type-based discrimination: check if field has expected JSON type + if typ := d.Next(); typ != jx.String { + // Field exists but has wrong type, not a match for this variant + return d.Skip() + } + match := TemplateSource0TemplateSource + if found && s.Type != match { + s.Type = "" + return errors.Errorf("multiple oneOf matches: (%v, %v)", s.Type, match) + } + found = true + s.Type = match + case "file": + // Type-based discrimination: check if field has expected JSON type + if typ := d.Next(); typ != jx.String { + // Field exists but has wrong type, not a match for this variant + return d.Skip() + } + match := TemplateSource1TemplateSource + if found && s.Type != match { + s.Type = "" + return errors.Errorf("multiple oneOf matches: (%v, %v)", s.Type, match) + } + found = true + s.Type = match + } + return d.Skip() + }) + }); err != nil { + return errors.Wrap(err, "capture") + } + if !found { + return errors.New("unable to detect sum type variant") + } + switch s.Type { + case TemplateSource0TemplateSource: + if err := s.TemplateSource0.Decode(d); err != nil { + return err + } + case TemplateSource1TemplateSource: + if err := s.TemplateSource1.Decode(d); err != nil { + return err + } + default: + return errors.Errorf("inferred invalid type: %s", s.Type) + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s TemplateSource) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateSource) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *TemplateSource0) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *TemplateSource0) encodeFields(e *jx.Encoder) { + { + e.FieldStart("mode") + e.Str("managed-build") + } + { + e.FieldStart("dir") + e.Str(s.Dir) + } +} + +var jsonFieldsNameOfTemplateSource0 = [2]string{ + 0: "mode", + 1: "dir", +} + +// Decode decodes TemplateSource0 from json. +func (s *TemplateSource0) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateSource0 to nil") + } + var requiredBitSet [1]uint8 + s.setDefaults() + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "mode": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.Mode = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"mode\"") + } + case "dir": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.Dir = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"dir\"") + } + default: + return errors.Errorf("unexpected field %q", k) + } + return nil + }); err != nil { + return errors.Wrap(err, "decode TemplateSource0") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfTemplateSource0) { + name = jsonFieldsNameOfTemplateSource0[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *TemplateSource0) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateSource0) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *TemplateSource1) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *TemplateSource1) encodeFields(e *jx.Encoder) { + { + e.FieldStart("mode") + e.Str("bundle") + } + { + e.FieldStart("file") + e.Str(s.File) + } +} + +var jsonFieldsNameOfTemplateSource1 = [2]string{ + 0: "mode", + 1: "file", +} + +// Decode decodes TemplateSource1 from json. +func (s *TemplateSource1) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateSource1 to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "mode": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.Mode = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"mode\"") + } + case "file": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.File = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"file\"") + } + default: + return errors.Errorf("unexpected field %q", k) + } + return nil + }); err != nil { + return errors.Wrap(err, "decode TemplateSource1") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfTemplateSource1) { + name = jsonFieldsNameOfTemplateSource1[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *TemplateSource1) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateSource1) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *TemplateVariable) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *TemplateVariable) encodeFields(e *jx.Encoder) { + { + e.FieldStart("key") + e.Str(s.Key) + } + { + e.FieldStart("prompt") + e.Str(s.Prompt) + } + { + if s.Default.Set { + e.FieldStart("default") + s.Default.Encode(e) + } + } + { + if s.File.Set { + e.FieldStart("file") + s.File.Encode(e) + } + } + { + e.FieldStart("type") + s.Type.Encode(e) + } + { + if s.Options != nil { + e.FieldStart("options") + e.ArrStart() + for _, elem := range s.Options { + e.Str(elem) + } + e.ArrEnd() + } + } + { + if s.Validation.Set { + e.FieldStart("validation") + s.Validation.Encode(e) + } + } +} + +var jsonFieldsNameOfTemplateVariable = [7]string{ + 0: "key", + 1: "prompt", + 2: "default", + 3: "file", + 4: "type", + 5: "options", + 6: "validation", +} + +// Decode decodes TemplateVariable from json. +func (s *TemplateVariable) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateVariable to nil") + } + var requiredBitSet [1]uint8 + s.setDefaults() + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "key": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.Key = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"key\"") + } + case "prompt": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.Prompt = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"prompt\"") + } + case "default": + if err := func() error { + s.Default.Reset() + if err := s.Default.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"default\"") + } + case "file": + if err := func() error { + s.File.Reset() + if err := s.File.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"file\"") + } + case "type": + requiredBitSet[0] |= 1 << 4 + if err := func() error { + if err := s.Type.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"type\"") + } + case "options": + if err := func() error { + s.Options = make([]string, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem string + v, err := d.Str() + elem = string(v) + if err != nil { + return err + } + s.Options = append(s.Options, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"options\"") + } + case "validation": + if err := func() error { + s.Validation.Reset() + if err := s.Validation.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"validation\"") + } + default: + return errors.Errorf("unexpected field %q", k) + } + return nil + }); err != nil { + return errors.Wrap(err, "decode TemplateVariable") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00010011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfTemplateVariable) { + name = jsonFieldsNameOfTemplateVariable[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *TemplateVariable) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateVariable) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes TemplateVariableType as json. +func (s TemplateVariableType) Encode(e *jx.Encoder) { + e.Str(string(s)) +} + +// Decode decodes TemplateVariableType from json. +func (s *TemplateVariableType) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateVariableType to nil") + } + v, err := d.StrBytes() + if err != nil { + return err + } + // Try to use constant string. + switch TemplateVariableType(v) { + case TemplateVariableTypeString: + *s = TemplateVariableTypeString + case TemplateVariableTypeSelect: + *s = TemplateVariableTypeSelect + case TemplateVariableTypeURL: + *s = TemplateVariableTypeURL + case TemplateVariableTypeEmail: + *s = TemplateVariableTypeEmail + default: + *s = TemplateVariableType(v) + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s TemplateVariableType) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateVariableType) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *TemplateVariableValidation) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *TemplateVariableValidation) encodeFields(e *jx.Encoder) { + { + if s.Pattern.Set { + e.FieldStart("pattern") + s.Pattern.Encode(e) + } + } + { + if s.MaxLength.Set { + e.FieldStart("maxLength") + s.MaxLength.Encode(e) + } + } +} + +var jsonFieldsNameOfTemplateVariableValidation = [2]string{ + 0: "pattern", + 1: "maxLength", +} + +// Decode decodes TemplateVariableValidation from json. +func (s *TemplateVariableValidation) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode TemplateVariableValidation to nil") + } + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "pattern": + if err := func() error { + s.Pattern.Reset() + if err := s.Pattern.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"pattern\"") + } + case "maxLength": + if err := func() error { + s.MaxLength.Reset() + if err := s.MaxLength.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"maxLength\"") + } + default: + return errors.Errorf("unexpected field %q", k) + } + return nil + }); err != nil { + return errors.Wrap(err, "decode TemplateVariableValidation") + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *TemplateVariableValidation) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *TemplateVariableValidation) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode encodes TestEndpointBadRequest as json. func (s *TestEndpointBadRequest) Encode(e *jx.Encoder) { unwrapped := (*ErrorResponse)(s) diff --git a/sdk-go/api/oas_operations_gen.go b/sdk-go/api/oas_operations_gen.go index 7b1f85c..46e5cd5 100644 --- a/sdk-go/api/oas_operations_gen.go +++ b/sdk-go/api/oas_operations_gen.go @@ -55,9 +55,12 @@ const ( GetSentEmailOperation OperationName = "GetSentEmail" GetSpendPolicyOperation OperationName = "GetSpendPolicy" GetStorageStatsOperation OperationName = "GetStorageStats" + GetTemplateOperation OperationName = "GetTemplate" + GetTemplateInstallOperation OperationName = "GetTemplateInstall" GetThreadOperation OperationName = "GetThread" GetWakeScheduleOperation OperationName = "GetWakeSchedule" GetWebhookSecretOperation OperationName = "GetWebhookSecret" + InstallTemplateOperation OperationName = "InstallTemplate" ListDeclinedPaymentsOperation OperationName = "ListDeclinedPayments" ListDeliveriesOperation OperationName = "ListDeliveries" ListDomainsOperation OperationName = "ListDomains" @@ -74,6 +77,7 @@ const ( ListRegistryRequestsOperation OperationName = "ListRegistryRequests" ListRoutesOperation OperationName = "ListRoutes" ListSentEmailsOperation OperationName = "ListSentEmails" + ListTemplatesOperation OperationName = "ListTemplates" ListWakeAuthorizationsOperation OperationName = "ListWakeAuthorizations" ListWakeDispatchesOperation OperationName = "ListWakeDispatches" ListWakeSchedulesOperation OperationName = "ListWakeSchedules" diff --git a/sdk-go/api/oas_parameters_gen.go b/sdk-go/api/oas_parameters_gen.go index 5504498..526c3a1 100644 --- a/sdk-go/api/oas_parameters_gen.go +++ b/sdk-go/api/oas_parameters_gen.go @@ -2764,6 +2764,158 @@ func decodeGetSentEmailParams(args [1]string, argsEscaped bool, r *http.Request) return params, nil } +// GetTemplateParams is parameters of getTemplate operation. +type GetTemplateParams struct { + // Template slug from the template manifest. + ID string +} + +func unpackGetTemplateParams(packed middleware.Parameters) (params GetTemplateParams) { + { + key := middleware.ParameterKey{ + Name: "id", + In: "path", + } + params.ID = packed[key].(string) + } + return params +} + +func decodeGetTemplateParams(args [1]string, argsEscaped bool, r *http.Request) (params GetTemplateParams, _ error) { + // Decode path: id. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "id", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + params.ID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: false, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: regexMap["^[a-z0-9][a-z0-9_-]{0,62}$"], + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(params.ID)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "id", + In: "path", + Err: err, + } + } + return params, nil +} + +// GetTemplateInstallParams is parameters of getTemplateInstall operation. +type GetTemplateInstallParams struct { + // Template install UUID. + ID uuid.UUID +} + +func unpackGetTemplateInstallParams(packed middleware.Parameters) (params GetTemplateInstallParams) { + { + key := middleware.ParameterKey{ + Name: "id", + In: "path", + } + params.ID = packed[key].(uuid.UUID) + } + return params +} + +func decodeGetTemplateInstallParams(args [1]string, argsEscaped bool, r *http.Request) (params GetTemplateInstallParams, _ error) { + // Decode path: id. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "id", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToUUID(val) + if err != nil { + return err + } + + params.ID = c + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "id", + In: "path", + Err: err, + } + } + return params, nil +} + // GetThreadParams is parameters of getThread operation. type GetThreadParams struct { // Resource UUID. @@ -2896,6 +3048,92 @@ func decodeGetWakeScheduleParams(args [1]string, argsEscaped bool, r *http.Reque return params, nil } +// InstallTemplateParams is parameters of installTemplate operation. +type InstallTemplateParams struct { + // Template slug from the template manifest. + ID string +} + +func unpackInstallTemplateParams(packed middleware.Parameters) (params InstallTemplateParams) { + { + key := middleware.ParameterKey{ + Name: "id", + In: "path", + } + params.ID = packed[key].(string) + } + return params +} + +func decodeInstallTemplateParams(args [1]string, argsEscaped bool, r *http.Request) (params InstallTemplateParams, _ error) { + // Decode path: id. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "id", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + params.ID = c + return nil + }(); err != nil { + return err + } + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: false, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: regexMap["^[a-z0-9][a-z0-9_-]{0,62}$"], + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(params.ID)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "id", + In: "path", + Err: err, + } + } + return params, nil +} + // ListDeliveriesParams is parameters of listDeliveries operation. type ListDeliveriesParams struct { // Pagination cursor from a previous response's `meta.cursor` field. @@ -4959,6 +5197,311 @@ func decodeListSentEmailsParams(args [0]string, argsEscaped bool, r *http.Reques return params, nil } +// ListTemplatesParams is parameters of listTemplates operation. +type ListTemplatesParams struct { + // Search templates by title, summary, or slug. + Q OptString `json:",omitempty,omitzero"` + // Filter templates by an exact tag. + Tag OptString `json:",omitempty,omitzero"` + // Cursor from a previous response `data.next_cursor` value. + Cursor OptString `json:",omitempty,omitzero"` + // Maximum number of templates to return. The server caps this at 100. + Limit OptInt `json:",omitempty,omitzero"` +} + +func unpackListTemplatesParams(packed middleware.Parameters) (params ListTemplatesParams) { + { + key := middleware.ParameterKey{ + Name: "q", + In: "query", + } + if v, ok := packed[key]; ok { + params.Q = v.(OptString) + } + } + { + key := middleware.ParameterKey{ + Name: "tag", + In: "query", + } + if v, ok := packed[key]; ok { + params.Tag = v.(OptString) + } + } + { + key := middleware.ParameterKey{ + Name: "cursor", + In: "query", + } + if v, ok := packed[key]; ok { + params.Cursor = v.(OptString) + } + } + { + key := middleware.ParameterKey{ + Name: "limit", + In: "query", + } + if v, ok := packed[key]; ok { + params.Limit = v.(OptInt) + } + } + return params +} + +func decodeListTemplatesParams(args [0]string, argsEscaped bool, r *http.Request) (params ListTemplatesParams, _ error) { + q := uri.NewQueryDecoder(r.URL.Query()) + // Decode query: q. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "q", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotQVal string + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + paramsDotQVal = c + return nil + }(); err != nil { + return err + } + params.Q.SetTo(paramsDotQVal) + return nil + }); err != nil { + return err + } + if err := func() error { + if value, ok := params.Q.Get(); ok { + if err := func() error { + if err := (validate.String{ + MinLength: 1, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(value)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "q", + In: "query", + Err: err, + } + } + // Decode query: tag. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "tag", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotTagVal string + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + paramsDotTagVal = c + return nil + }(); err != nil { + return err + } + params.Tag.SetTo(paramsDotTagVal) + return nil + }); err != nil { + return err + } + if err := func() error { + if value, ok := params.Tag.Get(); ok { + if err := func() error { + if err := (validate.String{ + MinLength: 1, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(value)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "tag", + In: "query", + Err: err, + } + } + // Decode query: cursor. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "cursor", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotCursorVal string + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + paramsDotCursorVal = c + return nil + }(); err != nil { + return err + } + params.Cursor.SetTo(paramsDotCursorVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "cursor", + In: "query", + Err: err, + } + } + // Set default value for query: limit. + { + val := int(50) + params.Limit.SetTo(val) + } + // Decode query: limit. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "limit", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotLimitVal int + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt(val) + if err != nil { + return err + } + + paramsDotLimitVal = c + return nil + }(); err != nil { + return err + } + params.Limit.SetTo(paramsDotLimitVal) + return nil + }); err != nil { + return err + } + if err := func() error { + if value, ok := params.Limit.Get(); ok { + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 1, + MaxSet: true, + Max: 100, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + Pattern: nil, + }).Validate(int64(value)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "limit", + In: "query", + Err: err, + } + } + return params, nil +} + // ListWakeAuthorizationsParams is parameters of listWakeAuthorizations operation. type ListWakeAuthorizationsParams struct { // Only return grants for this target endpoint. diff --git a/sdk-go/api/oas_request_decoders_gen.go b/sdk-go/api/oas_request_decoders_gen.go index 9a1fd92..13f7ad7 100644 --- a/sdk-go/api/oas_request_decoders_gen.go +++ b/sdk-go/api/oas_request_decoders_gen.go @@ -1351,6 +1351,85 @@ func (s *Server) decodeDefineAgentRequest(r *http.Request) ( } } +func (s *Server) decodeInstallTemplateRequest(r *http.Request) ( + req *InstallTemplateBody, + rawBody []byte, + close func() error, + rerr error, +) { + var closers []func() error + close = func() error { + var merr error + // Close in reverse order, to match defer behavior. + for i := len(closers) - 1; i >= 0; i-- { + c := closers[i] + merr = errors.Join(merr, c()) + } + return merr + } + defer func() { + if rerr != nil { + rerr = errors.Join(rerr, close()) + } + }() + ct, _, err := mime.ParseMediaType(r.Header.Get("Content-Type")) + if err != nil { + return req, rawBody, close, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + if r.ContentLength == 0 { + return req, rawBody, close, validate.ErrBodyRequired + } + buf, err := io.ReadAll(r.Body) + defer func() { + _ = r.Body.Close() + }() + if err != nil { + return req, rawBody, close, err + } + + // Reset the body to allow for downstream reading. + r.Body = io.NopCloser(bytes.NewBuffer(buf)) + + if len(buf) == 0 { + return req, rawBody, close, validate.ErrBodyRequired + } + + rawBody = append(rawBody, buf...) + d := jx.DecodeBytes(buf) + + var request InstallTemplateBody + if err := func() error { + if err := request.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return req, rawBody, close, err + } + if err := func() error { + if err := request.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return req, rawBody, close, errors.Wrap(err, "validate") + } + return &request, rawBody, close, nil + default: + return req, rawBody, close, validate.InvalidContentType(ct) + } +} + func (s *Server) decodePayChallengeRequest(r *http.Request) ( req *PayChallengeInput, rawBody []byte, diff --git a/sdk-go/api/oas_request_encoders_gen.go b/sdk-go/api/oas_request_encoders_gen.go index a4743b9..9b434ee 100644 --- a/sdk-go/api/oas_request_encoders_gen.go +++ b/sdk-go/api/oas_request_encoders_gen.go @@ -256,6 +256,20 @@ func encodeDefineAgentRequest( return nil } +func encodeInstallTemplateRequest( + req *InstallTemplateBody, + r *http.Request, +) error { + const contentType = "application/json" + e := new(jx.Encoder) + { + req.Encode(e) + } + encoded := e.Bytes() + ht.SetBody(r, bytes.NewReader(encoded), contentType) + return nil +} + func encodePayChallengeRequest( req *PayChallengeInput, r *http.Request, diff --git a/sdk-go/api/oas_response_decoders_gen.go b/sdk-go/api/oas_response_decoders_gen.go index 29c5f91..6596dbd 100644 --- a/sdk-go/api/oas_response_decoders_gen.go +++ b/sdk-go/api/oas_response_decoders_gen.go @@ -9735,6 +9735,538 @@ func decodeGetStorageStatsResponse(resp *http.Response) (res GetStorageStatsRes, return res, validate.UnexpectedStatusCodeWithResponse(resp) } +func decodeGetTemplateResponse(resp *http.Response) (res GetTemplateRes, _ error) { + switch resp.StatusCode { + case 200: + // Code 200. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetTemplateOK + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 400: + // Code 400. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetTemplateBadRequest + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 404: + // Code 404. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetTemplateNotFound + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 429: + // Code 429. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response ErrorResponse + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + var wrapper RateLimitedHeaders + wrapper.Response = response + h := uri.NewHeaderDecoder(resp.Header) + // Parse "Retry-After" header. + { + cfg := uri.HeaderParameterDecodingConfig{ + Name: "Retry-After", + Explode: false, + } + if err := func() error { + if err := h.HasParam(cfg); err == nil { + if err := h.DecodeParam(cfg, func(d uri.Decoder) error { + var wrapperDotRetryAfterVal int + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt(val) + if err != nil { + return err + } + + wrapperDotRetryAfterVal = c + return nil + }(); err != nil { + return err + } + wrapper.RetryAfter.SetTo(wrapperDotRetryAfterVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "parse Retry-After header") + } + } + return &wrapper, nil + default: + return res, validate.InvalidContentType(ct) + } + } + return res, validate.UnexpectedStatusCodeWithResponse(resp) +} + +func decodeGetTemplateInstallResponse(resp *http.Response) (res GetTemplateInstallRes, _ error) { + switch resp.StatusCode { + case 200: + // Code 200. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetTemplateInstallOK + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 400: + // Code 400. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetTemplateInstallBadRequest + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 401: + // Code 401. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetTemplateInstallUnauthorized + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 403: + // Code 403. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetTemplateInstallForbidden + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 404: + // Code 404. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetTemplateInstallNotFound + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 429: + // Code 429. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response ErrorResponse + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + var wrapper RateLimitedHeaders + wrapper.Response = response + h := uri.NewHeaderDecoder(resp.Header) + // Parse "Retry-After" header. + { + cfg := uri.HeaderParameterDecodingConfig{ + Name: "Retry-After", + Explode: false, + } + if err := func() error { + if err := h.HasParam(cfg); err == nil { + if err := h.DecodeParam(cfg, func(d uri.Decoder) error { + var wrapperDotRetryAfterVal int + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt(val) + if err != nil { + return err + } + + wrapperDotRetryAfterVal = c + return nil + }(); err != nil { + return err + } + wrapper.RetryAfter.SetTo(wrapperDotRetryAfterVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "parse Retry-After header") + } + } + return &wrapper, nil + default: + return res, validate.InvalidContentType(ct) + } + } + return res, validate.UnexpectedStatusCodeWithResponse(resp) +} + func decodeGetThreadResponse(resp *http.Response) (res GetThreadRes, _ error) { switch resp.StatusCode { case 200: @@ -9751,7 +10283,224 @@ func decodeGetThreadResponse(resp *http.Response) (res GetThreadRes, _ error) { } d := jx.DecodeBytes(buf) - var response GetThreadOK + var response GetThreadOK + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 400: + // Code 400. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetThreadBadRequest + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 401: + // Code 401. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetThreadUnauthorized + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 404: + // Code 404. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetThreadNotFound + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + } + return res, validate.UnexpectedStatusCodeWithResponse(resp) +} + +func decodeGetWakeScheduleResponse(resp *http.Response) (res GetWakeScheduleRes, _ error) { + switch resp.StatusCode { + case 200: + // Code 200. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetWakeScheduleOK + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 401: + // Code 401. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetWakeScheduleUnauthorized if err := func() error { if err := response.Decode(d); err != nil { return err @@ -9781,8 +10530,8 @@ func decodeGetThreadResponse(resp *http.Response) (res GetThreadRes, _ error) { default: return res, validate.InvalidContentType(ct) } - case 400: - // Code 400. + case 404: + // Code 404. ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) if err != nil { return res, errors.Wrap(err, "parse media type") @@ -9795,7 +10544,7 @@ func decodeGetThreadResponse(resp *http.Response) (res GetThreadRes, _ error) { } d := jx.DecodeBytes(buf) - var response GetThreadBadRequest + var response GetWakeScheduleNotFound if err := func() error { if err := response.Decode(d); err != nil { return err @@ -9825,6 +10574,47 @@ func decodeGetThreadResponse(resp *http.Response) (res GetThreadRes, _ error) { default: return res, validate.InvalidContentType(ct) } + } + return res, validate.UnexpectedStatusCodeWithResponse(resp) +} + +func decodeGetWebhookSecretResponse(resp *http.Response) (res GetWebhookSecretRes, _ error) { + switch resp.StatusCode { + case 200: + // Code 200. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetWebhookSecretOK + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } case 401: // Code 401. ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) @@ -9839,7 +10629,7 @@ func decodeGetThreadResponse(resp *http.Response) (res GetThreadRes, _ error) { } d := jx.DecodeBytes(buf) - var response GetThreadUnauthorized + var response GetWebhookSecretUnauthorized if err := func() error { if err := response.Decode(d); err != nil { return err @@ -9883,7 +10673,7 @@ func decodeGetThreadResponse(resp *http.Response) (res GetThreadRes, _ error) { } d := jx.DecodeBytes(buf) - var response GetThreadNotFound + var response GetWebhookSecretNotFound if err := func() error { if err := response.Decode(d); err != nil { return err @@ -9917,10 +10707,10 @@ func decodeGetThreadResponse(resp *http.Response) (res GetThreadRes, _ error) { return res, validate.UnexpectedStatusCodeWithResponse(resp) } -func decodeGetWakeScheduleResponse(resp *http.Response) (res GetWakeScheduleRes, _ error) { +func decodeInstallTemplateResponse(resp *http.Response) (res InstallTemplateRes, _ error) { switch resp.StatusCode { - case 200: - // Code 200. + case 201: + // Code 201. ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) if err != nil { return res, errors.Wrap(err, "parse media type") @@ -9933,7 +10723,95 @@ func decodeGetWakeScheduleResponse(resp *http.Response) (res GetWakeScheduleRes, } d := jx.DecodeBytes(buf) - var response GetWakeScheduleOK + var response InstallTemplateCreated + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 400: + // Code 400. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response InstallTemplateBadRequest + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 401: + // Code 401. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response InstallTemplateUnauthorized if err := func() error { if err := response.Decode(d); err != nil { return err @@ -9950,12 +10828,21 @@ func decodeGetWakeScheduleResponse(resp *http.Response) (res GetWakeScheduleRes, } return res, err } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } return &response, nil default: return res, validate.InvalidContentType(ct) } - case 401: - // Code 401. + case 403: + // Code 403. ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) if err != nil { return res, errors.Wrap(err, "parse media type") @@ -9968,7 +10855,7 @@ func decodeGetWakeScheduleResponse(resp *http.Response) (res GetWakeScheduleRes, } d := jx.DecodeBytes(buf) - var response GetWakeScheduleUnauthorized + var response InstallTemplateForbidden if err := func() error { if err := response.Decode(d); err != nil { return err @@ -10012,7 +10899,7 @@ func decodeGetWakeScheduleResponse(resp *http.Response) (res GetWakeScheduleRes, } d := jx.DecodeBytes(buf) - var response GetWakeScheduleNotFound + var response InstallTemplateNotFound if err := func() error { if err := response.Decode(d); err != nil { return err @@ -10042,14 +10929,8 @@ func decodeGetWakeScheduleResponse(resp *http.Response) (res GetWakeScheduleRes, default: return res, validate.InvalidContentType(ct) } - } - return res, validate.UnexpectedStatusCodeWithResponse(resp) -} - -func decodeGetWebhookSecretResponse(resp *http.Response) (res GetWebhookSecretRes, _ error) { - switch resp.StatusCode { - case 200: - // Code 200. + case 409: + // Code 409. ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) if err != nil { return res, errors.Wrap(err, "parse media type") @@ -10062,7 +10943,7 @@ func decodeGetWebhookSecretResponse(resp *http.Response) (res GetWebhookSecretRe } d := jx.DecodeBytes(buf) - var response GetWebhookSecretOK + var response InstallTemplateConflict if err := func() error { if err := response.Decode(d); err != nil { return err @@ -10079,12 +10960,21 @@ func decodeGetWebhookSecretResponse(resp *http.Response) (res GetWebhookSecretRe } return res, err } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } return &response, nil default: return res, validate.InvalidContentType(ct) } - case 401: - // Code 401. + case 422: + // Code 422. ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) if err != nil { return res, errors.Wrap(err, "parse media type") @@ -10097,7 +10987,7 @@ func decodeGetWebhookSecretResponse(resp *http.Response) (res GetWebhookSecretRe } d := jx.DecodeBytes(buf) - var response GetWebhookSecretUnauthorized + var response InstallTemplateUnprocessableEntity if err := func() error { if err := response.Decode(d); err != nil { return err @@ -10127,8 +11017,8 @@ func decodeGetWebhookSecretResponse(resp *http.Response) (res GetWebhookSecretRe default: return res, validate.InvalidContentType(ct) } - case 404: - // Code 404. + case 429: + // Code 429. ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) if err != nil { return res, errors.Wrap(err, "parse media type") @@ -10141,7 +11031,7 @@ func decodeGetWebhookSecretResponse(resp *http.Response) (res GetWebhookSecretRe } d := jx.DecodeBytes(buf) - var response GetWebhookSecretNotFound + var response ErrorResponse if err := func() error { if err := response.Decode(d); err != nil { return err @@ -10167,7 +11057,47 @@ func decodeGetWebhookSecretResponse(resp *http.Response) (res GetWebhookSecretRe }(); err != nil { return res, errors.Wrap(err, "validate") } - return &response, nil + var wrapper RateLimitedHeaders + wrapper.Response = response + h := uri.NewHeaderDecoder(resp.Header) + // Parse "Retry-After" header. + { + cfg := uri.HeaderParameterDecodingConfig{ + Name: "Retry-After", + Explode: false, + } + if err := func() error { + if err := h.HasParam(cfg); err == nil { + if err := h.DecodeParam(cfg, func(d uri.Decoder) error { + var wrapperDotRetryAfterVal int + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt(val) + if err != nil { + return err + } + + wrapperDotRetryAfterVal = c + return nil + }(); err != nil { + return err + } + wrapper.RetryAfter.SetTo(wrapperDotRetryAfterVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "parse Retry-After header") + } + } + return &wrapper, nil default: return res, validate.InvalidContentType(ct) } @@ -12243,6 +13173,184 @@ func decodeListSentEmailsResponse(resp *http.Response) (res ListSentEmailsRes, _ return res, validate.UnexpectedStatusCodeWithResponse(resp) } +func decodeListTemplatesResponse(resp *http.Response) (res ListTemplatesRes, _ error) { + switch resp.StatusCode { + case 200: + // Code 200. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response ListTemplatesOK + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 400: + // Code 400. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response ErrorResponse + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 429: + // Code 429. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response ErrorResponse + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + var wrapper RateLimitedHeaders + wrapper.Response = response + h := uri.NewHeaderDecoder(resp.Header) + // Parse "Retry-After" header. + { + cfg := uri.HeaderParameterDecodingConfig{ + Name: "Retry-After", + Explode: false, + } + if err := func() error { + if err := h.HasParam(cfg); err == nil { + if err := h.DecodeParam(cfg, func(d uri.Decoder) error { + var wrapperDotRetryAfterVal int + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToInt(val) + if err != nil { + return err + } + + wrapperDotRetryAfterVal = c + return nil + }(); err != nil { + return err + } + wrapper.RetryAfter.SetTo(wrapperDotRetryAfterVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "parse Retry-After header") + } + } + return &wrapper, nil + default: + return res, validate.InvalidContentType(ct) + } + } + return res, validate.UnexpectedStatusCodeWithResponse(resp) +} + func decodeListWakeAuthorizationsResponse(resp *http.Response) (res ListWakeAuthorizationsRes, _ error) { switch resp.StatusCode { case 200: diff --git a/sdk-go/api/oas_response_encoders_gen.go b/sdk-go/api/oas_response_encoders_gen.go index 292bba9..25bd601 100644 --- a/sdk-go/api/oas_response_encoders_gen.go +++ b/sdk-go/api/oas_response_encoders_gen.go @@ -3377,6 +3377,190 @@ func encodeGetStorageStatsResponse(response GetStorageStatsRes, w http.ResponseW } } +func encodeGetTemplateResponse(response GetTemplateRes, w http.ResponseWriter, span trace.Span) error { + switch response := response.(type) { + case *GetTemplateOK: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(200) + span.SetStatus(codes.Ok, http.StatusText(200)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *GetTemplateBadRequest: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(400) + span.SetStatus(codes.Error, http.StatusText(400)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *GetTemplateNotFound: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(404) + span.SetStatus(codes.Error, http.StatusText(404)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *RateLimitedHeaders: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.Header().Set("Access-Control-Expose-Headers", "Retry-After") + // Encoding response headers. + { + h := uri.NewHeaderEncoder(w.Header()) + // Encode "Retry-After" header. + { + cfg := uri.HeaderParameterEncodingConfig{ + Name: "Retry-After", + Explode: false, + } + if err := h.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := response.RetryAfter.Get(); ok { + return e.EncodeValue(conv.IntToString(val)) + } + return nil + }); err != nil { + return errors.Wrap(err, "encode Retry-After header") + } + } + } + w.WriteHeader(429) + span.SetStatus(codes.Error, http.StatusText(429)) + + e := new(jx.Encoder) + response.Response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + default: + return errors.Errorf("unexpected response type: %T", response) + } +} + +func encodeGetTemplateInstallResponse(response GetTemplateInstallRes, w http.ResponseWriter, span trace.Span) error { + switch response := response.(type) { + case *GetTemplateInstallOK: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(200) + span.SetStatus(codes.Ok, http.StatusText(200)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *GetTemplateInstallBadRequest: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(400) + span.SetStatus(codes.Error, http.StatusText(400)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *GetTemplateInstallUnauthorized: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(401) + span.SetStatus(codes.Error, http.StatusText(401)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *GetTemplateInstallForbidden: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(403) + span.SetStatus(codes.Error, http.StatusText(403)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *GetTemplateInstallNotFound: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(404) + span.SetStatus(codes.Error, http.StatusText(404)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *RateLimitedHeaders: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.Header().Set("Access-Control-Expose-Headers", "Retry-After") + // Encoding response headers. + { + h := uri.NewHeaderEncoder(w.Header()) + // Encode "Retry-After" header. + { + cfg := uri.HeaderParameterEncodingConfig{ + Name: "Retry-After", + Explode: false, + } + if err := h.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := response.RetryAfter.Get(); ok { + return e.EncodeValue(conv.IntToString(val)) + } + return nil + }); err != nil { + return errors.Wrap(err, "encode Retry-After header") + } + } + } + w.WriteHeader(429) + span.SetStatus(codes.Error, http.StatusText(429)) + + e := new(jx.Encoder) + response.Response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + default: + return errors.Errorf("unexpected response type: %T", response) + } +} + func encodeGetThreadResponse(response GetThreadRes, w http.ResponseWriter, span trace.Span) error { switch response := response.(type) { case *GetThreadOK: @@ -3528,6 +3712,137 @@ func encodeGetWebhookSecretResponse(response GetWebhookSecretRes, w http.Respons } } +func encodeInstallTemplateResponse(response InstallTemplateRes, w http.ResponseWriter, span trace.Span) error { + switch response := response.(type) { + case *InstallTemplateCreated: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(201) + span.SetStatus(codes.Ok, http.StatusText(201)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *InstallTemplateBadRequest: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(400) + span.SetStatus(codes.Error, http.StatusText(400)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *InstallTemplateUnauthorized: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(401) + span.SetStatus(codes.Error, http.StatusText(401)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *InstallTemplateForbidden: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(403) + span.SetStatus(codes.Error, http.StatusText(403)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *InstallTemplateNotFound: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(404) + span.SetStatus(codes.Error, http.StatusText(404)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *InstallTemplateConflict: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(409) + span.SetStatus(codes.Error, http.StatusText(409)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *InstallTemplateUnprocessableEntity: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(422) + span.SetStatus(codes.Error, http.StatusText(422)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *RateLimitedHeaders: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.Header().Set("Access-Control-Expose-Headers", "Retry-After") + // Encoding response headers. + { + h := uri.NewHeaderEncoder(w.Header()) + // Encode "Retry-After" header. + { + cfg := uri.HeaderParameterEncodingConfig{ + Name: "Retry-After", + Explode: false, + } + if err := h.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := response.RetryAfter.Get(); ok { + return e.EncodeValue(conv.IntToString(val)) + } + return nil + }); err != nil { + return errors.Wrap(err, "encode Retry-After header") + } + } + } + w.WriteHeader(429) + span.SetStatus(codes.Error, http.StatusText(429)) + + e := new(jx.Encoder) + response.Response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + default: + return errors.Errorf("unexpected response type: %T", response) + } +} + func encodeListDeclinedPaymentsResponse(response ListDeclinedPaymentsRes, w http.ResponseWriter, span trace.Span) error { switch response := response.(type) { case *ListDeclinedPaymentsOK: @@ -4233,6 +4548,72 @@ func encodeListSentEmailsResponse(response ListSentEmailsRes, w http.ResponseWri } } +func encodeListTemplatesResponse(response ListTemplatesRes, w http.ResponseWriter, span trace.Span) error { + switch response := response.(type) { + case *ListTemplatesOK: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(200) + span.SetStatus(codes.Ok, http.StatusText(200)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *ErrorResponse: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(400) + span.SetStatus(codes.Error, http.StatusText(400)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *RateLimitedHeaders: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.Header().Set("Access-Control-Expose-Headers", "Retry-After") + // Encoding response headers. + { + h := uri.NewHeaderEncoder(w.Header()) + // Encode "Retry-After" header. + { + cfg := uri.HeaderParameterEncodingConfig{ + Name: "Retry-After", + Explode: false, + } + if err := h.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := response.RetryAfter.Get(); ok { + return e.EncodeValue(conv.IntToString(val)) + } + return nil + }); err != nil { + return errors.Wrap(err, "encode Retry-After header") + } + } + } + w.WriteHeader(429) + span.SetStatus(codes.Error, http.StatusText(429)) + + e := new(jx.Encoder) + response.Response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + default: + return errors.Errorf("unexpected response type: %T", response) + } +} + func encodeListWakeAuthorizationsResponse(response ListWakeAuthorizationsRes, w http.ResponseWriter, span trace.Span) error { switch response := response.(type) { case *ListWakeAuthorizationsOK: diff --git a/sdk-go/api/oas_router_gen.go b/sdk-go/api/oas_router_gen.go index 5d3434f..ca055a7 100644 --- a/sdk-go/api/oas_router_gen.go +++ b/sdk-go/api/oas_router_gen.go @@ -18,10 +18,10 @@ var ( rn74AllowedHeaders = map[string]string{ "GET": "Authorization", } - rn78AllowedHeaders = map[string]string{ + rn83AllowedHeaders = map[string]string{ "GET": "Authorization", } - rn106AllowedHeaders = map[string]string{ + rn113AllowedHeaders = map[string]string{ "POST": "Authorization", } rn4AllowedHeaders = map[string]string{ @@ -30,40 +30,40 @@ var ( rn6AllowedHeaders = map[string]string{ "POST": "Authorization,Content-Type", } - rn118AllowedHeaders = map[string]string{ + rn125AllowedHeaders = map[string]string{ "POST": "Authorization,Content-Type", } - rn127AllowedHeaders = map[string]string{ + rn134AllowedHeaders = map[string]string{ "POST": "Authorization,Content-Type", } - rn101AllowedHeaders = map[string]string{ + rn108AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn120AllowedHeaders = map[string]string{ + rn127AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn128AllowedHeaders = map[string]string{ + rn135AllowedHeaders = map[string]string{ "POST": "Content-Type", } rn29AllowedHeaders = map[string]string{ "POST": "Authorization,Content-Type", } - rn92AllowedHeaders = map[string]string{ + rn99AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn122AllowedHeaders = map[string]string{ + rn129AllowedHeaders = map[string]string{ "POST": "Content-Type", } rn3AllowedHeaders = map[string]string{ "POST": "Authorization,Content-Type", } - rn103AllowedHeaders = map[string]string{ + rn110AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn124AllowedHeaders = map[string]string{ + rn131AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn129AllowedHeaders = map[string]string{ + rn136AllowedHeaders = map[string]string{ "POST": "Content-Type", } rn1AllowedHeaders = map[string]string{ @@ -74,16 +74,16 @@ var ( "DELETE": "Authorization", "PATCH": "Authorization,Content-Type", } - rn131AllowedHeaders = map[string]string{ + rn138AllowedHeaders = map[string]string{ "POST": "Authorization", } rn53AllowedHeaders = map[string]string{ "GET": "Authorization", } - rn82AllowedHeaders = map[string]string{ + rn88AllowedHeaders = map[string]string{ "GET": "Authorization", } - rn108AllowedHeaders = map[string]string{ + rn115AllowedHeaders = map[string]string{ "GET": "Authorization", } rn34AllowedHeaders = map[string]string{ @@ -102,10 +102,10 @@ var ( rn54AllowedHeaders = map[string]string{ "GET": "Authorization", } - rn98AllowedHeaders = map[string]string{ + rn105AllowedHeaders = map[string]string{ "POST": "Authorization", } - rn100AllowedHeaders = map[string]string{ + rn107AllowedHeaders = map[string]string{ "POST": "Authorization,Content-Type", } rn10AllowedHeaders = map[string]string{ @@ -116,7 +116,7 @@ var ( "DELETE": "Authorization", "PATCH": "Authorization,Content-Type", } - rn125AllowedHeaders = map[string]string{ + rn132AllowedHeaders = map[string]string{ "POST": "Authorization", } rn11AllowedHeaders = map[string]string{ @@ -139,10 +139,10 @@ var ( "GET": "Authorization", "PUT": "Authorization,Content-Type", } - rn83AllowedHeaders = map[string]string{ + rn89AllowedHeaders = map[string]string{ "GET": "Authorization", } - rn115AllowedHeaders = map[string]string{ + rn122AllowedHeaders = map[string]string{ "DELETE": "Authorization", "PUT": "Authorization,Content-Type", } @@ -157,7 +157,7 @@ var ( "DELETE": "Authorization", "PUT": "Authorization,Content-Type", } - rn126AllowedHeaders = map[string]string{ + rn133AllowedHeaders = map[string]string{ "POST": "Authorization,Content-Type", } rn66AllowedHeaders = map[string]string{ @@ -171,7 +171,7 @@ var ( "GET": "Authorization,X-Primitive-Function-Id", "PUT": "Authorization,Content-Type,X-Primitive-Function-Id", } - rn109AllowedHeaders = map[string]string{ + rn116AllowedHeaders = map[string]string{ "GET": "Authorization,X-Primitive-Function-Id", } rn17AllowedHeaders = map[string]string{ @@ -190,13 +190,13 @@ var ( "DELETE": "Authorization", "PATCH": "Authorization,Content-Type", } - rn86AllowedHeaders = map[string]string{ + rn92AllowedHeaders = map[string]string{ "POST": "Authorization,Content-Type", } - rn105AllowedHeaders = map[string]string{ + rn112AllowedHeaders = map[string]string{ "DELETE": "Authorization", } - rn87AllowedHeaders = map[string]string{ + rn93AllowedHeaders = map[string]string{ "GET": "Authorization", } rn27AllowedHeaders = map[string]string{ @@ -206,32 +206,38 @@ var ( "GET": "Authorization", "POST": "Authorization,Content-Type", } - rn93AllowedHeaders = map[string]string{ + rn100AllowedHeaders = map[string]string{ "POST": "Authorization,Content-Type", } - rn116AllowedHeaders = map[string]string{ + rn123AllowedHeaders = map[string]string{ "POST": "Authorization,Content-Type", } rn45AllowedHeaders = map[string]string{ "DELETE": "Authorization", "PATCH": "Authorization,Content-Type", } - rn111AllowedHeaders = map[string]string{ + rn118AllowedHeaders = map[string]string{ "POST": "Authorization,Content-Type", } - rn113AllowedHeaders = map[string]string{ + rn120AllowedHeaders = map[string]string{ "POST": "Authorization,Content-Type,Idempotency-Key", } rn69AllowedHeaders = map[string]string{ "GET": "Authorization", } - rn88AllowedHeaders = map[string]string{ + rn94AllowedHeaders = map[string]string{ "GET": "Authorization", } rn72AllowedHeaders = map[string]string{ "GET": "Authorization", } - rn76AllowedHeaders = map[string]string{ + rn78AllowedHeaders = map[string]string{ + "GET": "Authorization", + } + rn84AllowedHeaders = map[string]string{ + "POST": "Authorization,Content-Type", + } + rn81AllowedHeaders = map[string]string{ "GET": "Authorization", } rn21AllowedHeaders = map[string]string{ @@ -242,7 +248,7 @@ var ( "DELETE": "Authorization", "PATCH": "Authorization,Content-Type", } - rn89AllowedHeaders = map[string]string{ + rn96AllowedHeaders = map[string]string{ "GET": "Authorization", } rn23AllowedHeaders = map[string]string{ @@ -254,13 +260,13 @@ var ( "GET": "Authorization", "PATCH": "Authorization,Content-Type", } - rn107AllowedHeaders = map[string]string{ + rn114AllowedHeaders = map[string]string{ "POST": "Authorization", } - rn81AllowedHeaders = map[string]string{ + rn87AllowedHeaders = map[string]string{ "GET": "Authorization", } - rn96AllowedHeaders = map[string]string{ + rn103AllowedHeaders = map[string]string{ "POST": "Authorization", } rn7AllowedHeaders = map[string]string{ @@ -269,16 +275,16 @@ var ( rn60AllowedHeaders = map[string]string{ "GET": "Authorization", } - rn90AllowedHeaders = map[string]string{ + rn97AllowedHeaders = map[string]string{ "POST": "Authorization,Content-Type", } - rn79AllowedHeaders = map[string]string{ + rn85AllowedHeaders = map[string]string{ "GET": "Authorization", } rn9AllowedHeaders = map[string]string{ "POST": "Authorization,Content-Type,Idempotency-Key", } - rn84AllowedHeaders = map[string]string{ + rn90AllowedHeaders = map[string]string{ "GET": "Authorization", "POST": "Authorization,Content-Type", } @@ -429,7 +435,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn78AllowedHeaders, + allowedHeaders: rn83AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -454,7 +460,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn106AllowedHeaders, + allowedHeaders: rn113AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -571,7 +577,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn118AllowedHeaders, + allowedHeaders: rn125AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -596,7 +602,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn127AllowedHeaders, + allowedHeaders: rn134AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -635,7 +641,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn101AllowedHeaders, + allowedHeaders: rn108AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -660,7 +666,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn120AllowedHeaders, + allowedHeaders: rn127AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -685,7 +691,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn128AllowedHeaders, + allowedHeaders: rn135AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -816,7 +822,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn92AllowedHeaders, + allowedHeaders: rn99AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -841,7 +847,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn122AllowedHeaders, + allowedHeaders: rn129AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -907,7 +913,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn103AllowedHeaders, + allowedHeaders: rn110AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -932,7 +938,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn124AllowedHeaders, + allowedHeaders: rn131AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -957,7 +963,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn129AllowedHeaders, + allowedHeaders: rn136AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -1065,7 +1071,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn131AllowedHeaders, + allowedHeaders: rn138AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -1134,7 +1140,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn82AllowedHeaders, + allowedHeaders: rn88AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -1171,7 +1177,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn108AllowedHeaders, + allowedHeaders: rn115AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -1375,7 +1381,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn98AllowedHeaders, + allowedHeaders: rn105AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -1402,7 +1408,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn100AllowedHeaders, + allowedHeaders: rn107AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -1504,7 +1510,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn125AllowedHeaders, + allowedHeaders: rn132AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -1729,7 +1735,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn83AllowedHeaders, + allowedHeaders: rn89AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -1772,7 +1778,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "DELETE,PUT", - allowedHeaders: rn115AllowedHeaders, + allowedHeaders: rn122AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -1901,7 +1907,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn126AllowedHeaders, + allowedHeaders: rn133AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -2040,7 +2046,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn109AllowedHeaders, + allowedHeaders: rn116AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -2233,7 +2239,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET,POST", - allowedHeaders: rn86AllowedHeaders, + allowedHeaders: rn92AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -2275,7 +2281,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "DELETE,GET", - allowedHeaders: rn105AllowedHeaders, + allowedHeaders: rn112AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -2303,7 +2309,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn87AllowedHeaders, + allowedHeaders: rn93AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -2411,7 +2417,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn93AllowedHeaders, + allowedHeaders: rn100AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -2437,7 +2443,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn116AllowedHeaders, + allowedHeaders: rn123AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -2512,7 +2518,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn111AllowedHeaders, + allowedHeaders: rn118AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -2561,7 +2567,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn113AllowedHeaders, + allowedHeaders: rn120AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -2612,7 +2618,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn88AllowedHeaders, + allowedHeaders: rn94AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -2663,40 +2669,186 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - case 't': // Prefix: "threads/" + case 't': // Prefix: "t" - if l := len("threads/"); len(elem) >= l && elem[0:l] == "threads/" { + if l := len("t"); len(elem) >= l && elem[0:l] == "t" { elem = elem[l:] } else { break } - // Param: "id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { + if len(elem) == 0 { break } - args[0] = elem - elem = "" + switch elem[0] { + case 'e': // Prefix: "emplates" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetThreadRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: rn76AllowedHeaders, - acceptPost: "", - acceptPatch: "", - }) + if l := len("emplates"); len(elem) >= l && elem[0:l] == "emplates" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleListTemplatesRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'i': // Prefix: "installs/" + origElem := elem + if l := len("installs/"); len(elem) >= l && elem[0:l] == "installs/" { + elem = elem[l:] + } else { + break + } + + // Param: "id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetTemplateInstallRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: rn78AllowedHeaders, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + elem = origElem + } + // Param: "id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetTemplateRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + switch elem[0] { + case '/': // Prefix: "/install" + + if l := len("/install"); len(elem) >= l && elem[0:l] == "/install" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleInstallTemplateRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn84AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + + } + + } + + case 'h': // Prefix: "hreads/" + + if l := len("hreads/"); len(elem) >= l && elem[0:l] == "hreads/" { + elem = elem[l:] + } else { + break + } + + // Param: "id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetThreadRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: rn81AllowedHeaders, + acceptPost: "", + acceptPatch: "", + }) + } + + return } - return } case 'w': // Prefix: "w" @@ -2807,7 +2959,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn89AllowedHeaders, + allowedHeaders: rn96AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -2903,7 +3055,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn107AllowedHeaders, + allowedHeaders: rn114AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -2933,7 +3085,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn81AllowedHeaders, + allowedHeaders: rn87AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -2981,7 +3133,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn96AllowedHeaders, + allowedHeaders: rn103AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -3085,7 +3237,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn90AllowedHeaders, + allowedHeaders: rn97AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -3114,7 +3266,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn79AllowedHeaders, + allowedHeaders: rn85AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -3166,7 +3318,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET,POST", - allowedHeaders: rn84AllowedHeaders, + allowedHeaders: rn90AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -5707,38 +5859,178 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 't': // Prefix: "threads/" + case 't': // Prefix: "t" - if l := len("threads/"); len(elem) >= l && elem[0:l] == "threads/" { + if l := len("t"); len(elem) >= l && elem[0:l] == "t" { elem = elem[l:] } else { break } - // Param: "id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { + if len(elem) == 0 { break } - args[0] = elem - elem = "" + switch elem[0] { + case 'e': // Prefix: "emplates" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetThreadOperation - r.summary = "Get a conversation thread by id" - r.operationID = "getThread" - r.operationGroup = "" - r.pathPattern = "/threads/{id}" - r.args = args - r.count = 1 - return r, true - default: - return + if l := len("emplates"); len(elem) >= l && elem[0:l] == "emplates" { + elem = elem[l:] + } else { + break } + + if len(elem) == 0 { + switch method { + case "GET": + r.name = ListTemplatesOperation + r.summary = "List function templates" + r.operationID = "listTemplates" + r.operationGroup = "" + r.pathPattern = "/templates" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'i': // Prefix: "installs/" + origElem := elem + if l := len("installs/"); len(elem) >= l && elem[0:l] == "installs/" { + elem = elem[l:] + } else { + break + } + + // Param: "id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetTemplateInstallOperation + r.summary = "Get template install status" + r.operationID = "getTemplateInstall" + r.operationGroup = "" + r.pathPattern = "/templates/installs/{id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + elem = origElem + } + // Param: "id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetTemplateOperation + r.summary = "Get a function template" + r.operationID = "getTemplate" + r.operationGroup = "" + r.pathPattern = "/templates/{id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/install" + + if l := len("/install"); len(elem) >= l && elem[0:l] == "/install" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = InstallTemplateOperation + r.summary = "Install a function template" + r.operationID = "installTemplate" + r.operationGroup = "" + r.pathPattern = "/templates/{id}/install" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + } + + case 'h': // Prefix: "hreads/" + + if l := len("hreads/"); len(elem) >= l && elem[0:l] == "hreads/" { + elem = elem[l:] + } else { + break + } + + // Param: "id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetThreadOperation + r.summary = "Get a conversation thread by id" + r.operationID = "getThread" + r.operationGroup = "" + r.pathPattern = "/threads/{id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + } case 'w': // Prefix: "w" diff --git a/sdk-go/api/oas_schemas_gen.go b/sdk-go/api/oas_schemas_gen.go index 2c4b07b..57f66d0 100644 --- a/sdk-go/api/oas_schemas_gen.go +++ b/sdk-go/api/oas_schemas_gen.go @@ -7470,6 +7470,7 @@ func (*ErrorResponse) listFunctionsRes() {} func (*ErrorResponse) listOrgSecretsRes() {} func (*ErrorResponse) listRegistriesRes() {} func (*ErrorResponse) listRoutesRes() {} +func (*ErrorResponse) listTemplatesRes() {} func (*ErrorResponse) listWakeDispatchesRes() {} func (*ErrorResponse) listWakeSchedulesRes() {} func (*ErrorResponse) pollCliLoginRes() {} @@ -7581,6 +7582,16 @@ const ( ErrorResponseErrorCodeOrgNotAccessible ErrorResponseErrorCode = "org_not_accessible" ErrorResponseErrorCodeFeatureDisabled ErrorResponseErrorCode = "feature_disabled" ErrorResponseErrorCodeMemoryConflict ErrorResponseErrorCode = "memory_conflict" + ErrorResponseErrorCodeTemplateNotInstallable ErrorResponseErrorCode = "template_not_installable" + ErrorResponseErrorCodeScaffoldOnly ErrorResponseErrorCode = "scaffold_only" + ErrorResponseErrorCodeInvalidVariables ErrorResponseErrorCode = "invalid_variables" + ErrorResponseErrorCodeUnknownSecrets ErrorResponseErrorCode = "unknown_secrets" + ErrorResponseErrorCodeMissingSecrets ErrorResponseErrorCode = "missing_secrets" + ErrorResponseErrorCodeNoInboundDomain ErrorResponseErrorCode = "no_inbound_domain" + ErrorResponseErrorCodeDomainCannotSend ErrorResponseErrorCode = "domain_cannot_send" + ErrorResponseErrorCodeAddressTaken ErrorResponseErrorCode = "address_taken" + ErrorResponseErrorCodeRouteCapReached ErrorResponseErrorCode = "route_cap_reached" + ErrorResponseErrorCodeNameExhausted ErrorResponseErrorCode = "name_exhausted" ErrorResponseErrorCodeDeveloperUsageCreditExhausted ErrorResponseErrorCode = "developer_usage_credit_exhausted" ErrorResponseErrorCodeNoPayoutAddress ErrorResponseErrorCode = "no_payout_address" ErrorResponseErrorCodeOwnershipProofFailed ErrorResponseErrorCode = "ownership_proof_failed" @@ -7627,6 +7638,16 @@ func (ErrorResponseErrorCode) AllValues() []ErrorResponseErrorCode { ErrorResponseErrorCodeOrgNotAccessible, ErrorResponseErrorCodeFeatureDisabled, ErrorResponseErrorCodeMemoryConflict, + ErrorResponseErrorCodeTemplateNotInstallable, + ErrorResponseErrorCodeScaffoldOnly, + ErrorResponseErrorCodeInvalidVariables, + ErrorResponseErrorCodeUnknownSecrets, + ErrorResponseErrorCodeMissingSecrets, + ErrorResponseErrorCodeNoInboundDomain, + ErrorResponseErrorCodeDomainCannotSend, + ErrorResponseErrorCodeAddressTaken, + ErrorResponseErrorCodeRouteCapReached, + ErrorResponseErrorCodeNameExhausted, ErrorResponseErrorCodeDeveloperUsageCreditExhausted, ErrorResponseErrorCodeNoPayoutAddress, ErrorResponseErrorCodeOwnershipProofFailed, @@ -7708,6 +7729,26 @@ func (s ErrorResponseErrorCode) MarshalText() ([]byte, error) { return []byte(s), nil case ErrorResponseErrorCodeMemoryConflict: return []byte(s), nil + case ErrorResponseErrorCodeTemplateNotInstallable: + return []byte(s), nil + case ErrorResponseErrorCodeScaffoldOnly: + return []byte(s), nil + case ErrorResponseErrorCodeInvalidVariables: + return []byte(s), nil + case ErrorResponseErrorCodeUnknownSecrets: + return []byte(s), nil + case ErrorResponseErrorCodeMissingSecrets: + return []byte(s), nil + case ErrorResponseErrorCodeNoInboundDomain: + return []byte(s), nil + case ErrorResponseErrorCodeDomainCannotSend: + return []byte(s), nil + case ErrorResponseErrorCodeAddressTaken: + return []byte(s), nil + case ErrorResponseErrorCodeRouteCapReached: + return []byte(s), nil + case ErrorResponseErrorCodeNameExhausted: + return []byte(s), nil case ErrorResponseErrorCodeDeveloperUsageCreditExhausted: return []byte(s), nil case ErrorResponseErrorCodeNoPayoutAddress: @@ -7832,6 +7873,36 @@ func (s *ErrorResponseErrorCode) UnmarshalText(data []byte) error { case ErrorResponseErrorCodeMemoryConflict: *s = ErrorResponseErrorCodeMemoryConflict return nil + case ErrorResponseErrorCodeTemplateNotInstallable: + *s = ErrorResponseErrorCodeTemplateNotInstallable + return nil + case ErrorResponseErrorCodeScaffoldOnly: + *s = ErrorResponseErrorCodeScaffoldOnly + return nil + case ErrorResponseErrorCodeInvalidVariables: + *s = ErrorResponseErrorCodeInvalidVariables + return nil + case ErrorResponseErrorCodeUnknownSecrets: + *s = ErrorResponseErrorCodeUnknownSecrets + return nil + case ErrorResponseErrorCodeMissingSecrets: + *s = ErrorResponseErrorCodeMissingSecrets + return nil + case ErrorResponseErrorCodeNoInboundDomain: + *s = ErrorResponseErrorCodeNoInboundDomain + return nil + case ErrorResponseErrorCodeDomainCannotSend: + *s = ErrorResponseErrorCodeDomainCannotSend + return nil + case ErrorResponseErrorCodeAddressTaken: + *s = ErrorResponseErrorCodeAddressTaken + return nil + case ErrorResponseErrorCodeRouteCapReached: + *s = ErrorResponseErrorCodeRouteCapReached + return nil + case ErrorResponseErrorCodeNameExhausted: + *s = ErrorResponseErrorCodeNameExhausted + return nil case ErrorResponseErrorCodeDeveloperUsageCreditExhausted: *s = ErrorResponseErrorCodeDeveloperUsageCreditExhausted return nil @@ -10922,6 +10993,86 @@ type GetStorageStatsUnauthorized ErrorResponse func (*GetStorageStatsUnauthorized) getStorageStatsRes() {} +type GetTemplateBadRequest ErrorResponse + +func (*GetTemplateBadRequest) getTemplateRes() {} + +type GetTemplateInstallBadRequest ErrorResponse + +func (*GetTemplateInstallBadRequest) getTemplateInstallRes() {} + +type GetTemplateInstallForbidden ErrorResponse + +func (*GetTemplateInstallForbidden) getTemplateInstallRes() {} + +type GetTemplateInstallNotFound ErrorResponse + +func (*GetTemplateInstallNotFound) getTemplateInstallRes() {} + +// Merged schema. +type GetTemplateInstallOK struct { + Success bool `json:"success"` + Data TemplateInstallStatus `json:"data"` +} + +// GetSuccess returns the value of Success. +func (s *GetTemplateInstallOK) GetSuccess() bool { + return s.Success +} + +// GetData returns the value of Data. +func (s *GetTemplateInstallOK) GetData() TemplateInstallStatus { + return s.Data +} + +// SetSuccess sets the value of Success. +func (s *GetTemplateInstallOK) SetSuccess(val bool) { + s.Success = val +} + +// SetData sets the value of Data. +func (s *GetTemplateInstallOK) SetData(val TemplateInstallStatus) { + s.Data = val +} + +func (*GetTemplateInstallOK) getTemplateInstallRes() {} + +type GetTemplateInstallUnauthorized ErrorResponse + +func (*GetTemplateInstallUnauthorized) getTemplateInstallRes() {} + +type GetTemplateNotFound ErrorResponse + +func (*GetTemplateNotFound) getTemplateRes() {} + +// Merged schema. +type GetTemplateOK struct { + Success bool `json:"success"` + Data TemplateRegistryDetail `json:"data"` +} + +// GetSuccess returns the value of Success. +func (s *GetTemplateOK) GetSuccess() bool { + return s.Success +} + +// GetData returns the value of Data. +func (s *GetTemplateOK) GetData() TemplateRegistryDetail { + return s.Data +} + +// SetSuccess sets the value of Success. +func (s *GetTemplateOK) SetSuccess(val bool) { + s.Success = val +} + +// SetData sets the value of Data. +func (s *GetTemplateOK) SetData(val TemplateRegistryDetail) { + s.Data = val +} + +func (*GetTemplateOK) getTemplateRes() {} + type GetThreadBadRequest ErrorResponse func (*GetThreadBadRequest) getThreadRes() {} @@ -11615,6 +11766,134 @@ func (s *InboxStatusRecentEmailSummary) SetLatestReceivedAt(val NilDateTime) { s.LatestReceivedAt = val } +type InstallTemplateBadRequest ErrorResponse + +func (*InstallTemplateBadRequest) installTemplateRes() {} + +// Ref: #/components/schemas/InstallTemplateBody +type InstallTemplateBody struct { + // Localpart to claim on the selected inbound domain. Defaults to the template slug. + Address OptString `json:"address"` + // Org domain name to claim the address on. Defaults to the org's newest active domain. + Domain OptString `json:"domain"` + // Template variable values keyed by manifest variable key. + Variables OptInstallTemplateBodyVariables `json:"variables"` + // Secret values keyed by manifest secret key. + Secrets OptInstallTemplateBodySecrets `json:"secrets"` +} + +// GetAddress returns the value of Address. +func (s *InstallTemplateBody) GetAddress() OptString { + return s.Address +} + +// GetDomain returns the value of Domain. +func (s *InstallTemplateBody) GetDomain() OptString { + return s.Domain +} + +// GetVariables returns the value of Variables. +func (s *InstallTemplateBody) GetVariables() OptInstallTemplateBodyVariables { + return s.Variables +} + +// GetSecrets returns the value of Secrets. +func (s *InstallTemplateBody) GetSecrets() OptInstallTemplateBodySecrets { + return s.Secrets +} + +// SetAddress sets the value of Address. +func (s *InstallTemplateBody) SetAddress(val OptString) { + s.Address = val +} + +// SetDomain sets the value of Domain. +func (s *InstallTemplateBody) SetDomain(val OptString) { + s.Domain = val +} + +// SetVariables sets the value of Variables. +func (s *InstallTemplateBody) SetVariables(val OptInstallTemplateBodyVariables) { + s.Variables = val +} + +// SetSecrets sets the value of Secrets. +func (s *InstallTemplateBody) SetSecrets(val OptInstallTemplateBodySecrets) { + s.Secrets = val +} + +// Secret values keyed by manifest secret key. +type InstallTemplateBodySecrets map[string]string + +func (s *InstallTemplateBodySecrets) init() InstallTemplateBodySecrets { + m := *s + if m == nil { + m = map[string]string{} + *s = m + } + return m +} + +// Template variable values keyed by manifest variable key. +type InstallTemplateBodyVariables map[string]string + +func (s *InstallTemplateBodyVariables) init() InstallTemplateBodyVariables { + m := *s + if m == nil { + m = map[string]string{} + *s = m + } + return m +} + +type InstallTemplateConflict ErrorResponse + +func (*InstallTemplateConflict) installTemplateRes() {} + +// Merged schema. +type InstallTemplateCreated struct { + Success bool `json:"success"` + Data TemplateInstallStatus `json:"data"` +} + +// GetSuccess returns the value of Success. +func (s *InstallTemplateCreated) GetSuccess() bool { + return s.Success +} + +// GetData returns the value of Data. +func (s *InstallTemplateCreated) GetData() TemplateInstallStatus { + return s.Data +} + +// SetSuccess sets the value of Success. +func (s *InstallTemplateCreated) SetSuccess(val bool) { + s.Success = val +} + +// SetData sets the value of Data. +func (s *InstallTemplateCreated) SetData(val TemplateInstallStatus) { + s.Data = val +} + +func (*InstallTemplateCreated) installTemplateRes() {} + +type InstallTemplateForbidden ErrorResponse + +func (*InstallTemplateForbidden) installTemplateRes() {} + +type InstallTemplateNotFound ErrorResponse + +func (*InstallTemplateNotFound) installTemplateRes() {} + +type InstallTemplateUnauthorized ErrorResponse + +func (*InstallTemplateUnauthorized) installTemplateRes() {} + +type InstallTemplateUnprocessableEntity ErrorResponse + +func (*InstallTemplateUnprocessableEntity) installTemplateRes() {} + type ListDeclinedPaymentsForbidden ErrorResponse func (*ListDeclinedPaymentsForbidden) listDeclinedPaymentsRes() {} @@ -12287,6 +12566,34 @@ type ListSentEmailsUnauthorized ErrorResponse func (*ListSentEmailsUnauthorized) listSentEmailsRes() {} +// Merged schema. +type ListTemplatesOK struct { + Success bool `json:"success"` + Data TemplateRegistryPage `json:"data"` +} + +// GetSuccess returns the value of Success. +func (s *ListTemplatesOK) GetSuccess() bool { + return s.Success +} + +// GetData returns the value of Data. +func (s *ListTemplatesOK) GetData() TemplateRegistryPage { + return s.Data +} + +// SetSuccess sets the value of Success. +func (s *ListTemplatesOK) SetSuccess(val bool) { + s.Success = val +} + +// SetData sets the value of Data. +func (s *ListTemplatesOK) SetData(val TemplateRegistryPage) { + s.Data = val +} + +func (*ListTemplatesOK) listTemplatesRes() {} + type ListWakeAuthorizationsBadRequest ErrorResponse func (*ListWakeAuthorizationsBadRequest) listWakeAuthorizationsRes() {} @@ -14658,6 +14965,98 @@ func (o OptGateFix) Or(d GateFix) GateFix { return d } +// NewOptInstallTemplateBodySecrets returns new OptInstallTemplateBodySecrets with value set to v. +func NewOptInstallTemplateBodySecrets(v InstallTemplateBodySecrets) OptInstallTemplateBodySecrets { + return OptInstallTemplateBodySecrets{ + Value: v, + Set: true, + } +} + +// OptInstallTemplateBodySecrets is optional InstallTemplateBodySecrets. +type OptInstallTemplateBodySecrets struct { + Value InstallTemplateBodySecrets + Set bool +} + +// IsSet returns true if OptInstallTemplateBodySecrets was set. +func (o OptInstallTemplateBodySecrets) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptInstallTemplateBodySecrets) Reset() { + var v InstallTemplateBodySecrets + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptInstallTemplateBodySecrets) SetTo(v InstallTemplateBodySecrets) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptInstallTemplateBodySecrets) Get() (v InstallTemplateBodySecrets, ok bool) { + if !o.Set { + return v, false + } + return o.Value, true +} + +// Or returns value if set, or given parameter if does not. +func (o OptInstallTemplateBodySecrets) Or(d InstallTemplateBodySecrets) InstallTemplateBodySecrets { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// NewOptInstallTemplateBodyVariables returns new OptInstallTemplateBodyVariables with value set to v. +func NewOptInstallTemplateBodyVariables(v InstallTemplateBodyVariables) OptInstallTemplateBodyVariables { + return OptInstallTemplateBodyVariables{ + Value: v, + Set: true, + } +} + +// OptInstallTemplateBodyVariables is optional InstallTemplateBodyVariables. +type OptInstallTemplateBodyVariables struct { + Value InstallTemplateBodyVariables + Set bool +} + +// IsSet returns true if OptInstallTemplateBodyVariables was set. +func (o OptInstallTemplateBodyVariables) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptInstallTemplateBodyVariables) Reset() { + var v InstallTemplateBodyVariables + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptInstallTemplateBodyVariables) SetTo(v InstallTemplateBodyVariables) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptInstallTemplateBodyVariables) Get() (v InstallTemplateBodyVariables, ok bool) { + if !o.Set { + return v, false + } + return o.Value, true +} + +// Or returns value if set, or given parameter if does not. +func (o OptInstallTemplateBodyVariables) Or(d InstallTemplateBodyVariables) InstallTemplateBodyVariables { + if v, ok := o.Get(); ok { + return v + } + return d +} + // NewOptInt returns new OptInt with value set to v. func NewOptInt(v int) OptInt { return OptInt{ @@ -16523,38 +16922,38 @@ func (o OptString) Or(d string) string { return d } -// NewOptTestFunctionReq returns new OptTestFunctionReq with value set to v. -func NewOptTestFunctionReq(v TestFunctionReq) OptTestFunctionReq { - return OptTestFunctionReq{ +// NewOptTemplateSetup returns new OptTemplateSetup with value set to v. +func NewOptTemplateSetup(v TemplateSetup) OptTemplateSetup { + return OptTemplateSetup{ Value: v, Set: true, } } -// OptTestFunctionReq is optional TestFunctionReq. -type OptTestFunctionReq struct { - Value TestFunctionReq +// OptTemplateSetup is optional TemplateSetup. +type OptTemplateSetup struct { + Value TemplateSetup Set bool } -// IsSet returns true if OptTestFunctionReq was set. -func (o OptTestFunctionReq) IsSet() bool { return o.Set } +// IsSet returns true if OptTemplateSetup was set. +func (o OptTemplateSetup) IsSet() bool { return o.Set } // Reset unsets value. -func (o *OptTestFunctionReq) Reset() { - var v TestFunctionReq +func (o *OptTemplateSetup) Reset() { + var v TemplateSetup o.Value = v o.Set = false } // SetTo sets value to v. -func (o *OptTestFunctionReq) SetTo(v TestFunctionReq) { +func (o *OptTemplateSetup) SetTo(v TemplateSetup) { o.Set = true o.Value = v } // Get returns value and boolean that denotes whether value was set. -func (o OptTestFunctionReq) Get() (v TestFunctionReq, ok bool) { +func (o OptTemplateSetup) Get() (v TemplateSetup, ok bool) { if !o.Set { return v, false } @@ -16562,23 +16961,115 @@ func (o OptTestFunctionReq) Get() (v TestFunctionReq, ok bool) { } // Or returns value if set, or given parameter if does not. -func (o OptTestFunctionReq) Or(d TestFunctionReq) TestFunctionReq { +func (o OptTemplateSetup) Or(d TemplateSetup) TemplateSetup { if v, ok := o.Get(); ok { return v } return d } -// NewOptURI returns new OptURI with value set to v. -func NewOptURI(v url.URL) OptURI { - return OptURI{ +// NewOptTemplateVariableValidation returns new OptTemplateVariableValidation with value set to v. +func NewOptTemplateVariableValidation(v TemplateVariableValidation) OptTemplateVariableValidation { + return OptTemplateVariableValidation{ Value: v, Set: true, } } -// OptURI is optional url.URL. -type OptURI struct { +// OptTemplateVariableValidation is optional TemplateVariableValidation. +type OptTemplateVariableValidation struct { + Value TemplateVariableValidation + Set bool +} + +// IsSet returns true if OptTemplateVariableValidation was set. +func (o OptTemplateVariableValidation) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptTemplateVariableValidation) Reset() { + var v TemplateVariableValidation + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptTemplateVariableValidation) SetTo(v TemplateVariableValidation) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptTemplateVariableValidation) Get() (v TemplateVariableValidation, ok bool) { + if !o.Set { + return v, false + } + return o.Value, true +} + +// Or returns value if set, or given parameter if does not. +func (o OptTemplateVariableValidation) Or(d TemplateVariableValidation) TemplateVariableValidation { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// NewOptTestFunctionReq returns new OptTestFunctionReq with value set to v. +func NewOptTestFunctionReq(v TestFunctionReq) OptTestFunctionReq { + return OptTestFunctionReq{ + Value: v, + Set: true, + } +} + +// OptTestFunctionReq is optional TestFunctionReq. +type OptTestFunctionReq struct { + Value TestFunctionReq + Set bool +} + +// IsSet returns true if OptTestFunctionReq was set. +func (o OptTestFunctionReq) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptTestFunctionReq) Reset() { + var v TestFunctionReq + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptTestFunctionReq) SetTo(v TestFunctionReq) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptTestFunctionReq) Get() (v TestFunctionReq, ok bool) { + if !o.Set { + return v, false + } + return o.Value, true +} + +// Or returns value if set, or given parameter if does not. +func (o OptTestFunctionReq) Or(d TestFunctionReq) TestFunctionReq { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// NewOptURI returns new OptURI with value set to v. +func NewOptURI(v url.URL) OptURI { + return OptURI{ + Value: v, + Set: true, + } +} + +// OptURI is optional url.URL. +type OptURI struct { Value url.URL Set bool } @@ -17810,8 +18301,12 @@ func (*RateLimitedHeaders) getChallengeRes() {} func (*RateLimitedHeaders) getInboxStatusRes() {} func (*RateLimitedHeaders) getMemoryRes() {} func (*RateLimitedHeaders) getSpendPolicyRes() {} +func (*RateLimitedHeaders) getTemplateInstallRes() {} +func (*RateLimitedHeaders) getTemplateRes() {} +func (*RateLimitedHeaders) installTemplateRes() {} func (*RateLimitedHeaders) listDeclinedPaymentsRes() {} func (*RateLimitedHeaders) listPayoutAddressesRes() {} +func (*RateLimitedHeaders) listTemplatesRes() {} func (*RateLimitedHeaders) payChallengeRes() {} func (*RateLimitedHeaders) registerPayoutAddressRes() {} func (*RateLimitedHeaders) replayDeliveryRes() {} @@ -23507,6 +24002,1234 @@ func (s *StorageStats) SetEmailsCount(val int) { s.EmailsCount = val } +// Ref: #/components/schemas/TemplateAuthor +type TemplateAuthor struct { + ID string `json:"id"` + Name string `json:"name"` + URL OptURI `json:"url"` +} + +// GetID returns the value of ID. +func (s *TemplateAuthor) GetID() string { + return s.ID +} + +// GetName returns the value of Name. +func (s *TemplateAuthor) GetName() string { + return s.Name +} + +// GetURL returns the value of URL. +func (s *TemplateAuthor) GetURL() OptURI { + return s.URL +} + +// SetID sets the value of ID. +func (s *TemplateAuthor) SetID(val string) { + s.ID = val +} + +// SetName sets the value of Name. +func (s *TemplateAuthor) SetName(val string) { + s.Name = val +} + +// SetURL sets the value of URL. +func (s *TemplateAuthor) SetURL(val OptURI) { + s.URL = val +} + +// Ref: #/components/schemas/TemplateInstall +type TemplateInstall struct { + Mode TemplateInstallMode `json:"mode"` + EditFiles []string `json:"editFiles"` + Reason string `json:"reason"` +} + +// GetMode returns the value of Mode. +func (s *TemplateInstall) GetMode() TemplateInstallMode { + return s.Mode +} + +// GetEditFiles returns the value of EditFiles. +func (s *TemplateInstall) GetEditFiles() []string { + return s.EditFiles +} + +// GetReason returns the value of Reason. +func (s *TemplateInstall) GetReason() string { + return s.Reason +} + +// SetMode sets the value of Mode. +func (s *TemplateInstall) SetMode(val TemplateInstallMode) { + s.Mode = val +} + +// SetEditFiles sets the value of EditFiles. +func (s *TemplateInstall) SetEditFiles(val []string) { + s.EditFiles = val +} + +// SetReason sets the value of Reason. +func (s *TemplateInstall) SetReason(val string) { + s.Reason = val +} + +type TemplateInstallMode string + +const ( + TemplateInstallModeDeploy TemplateInstallMode = "deploy" + TemplateInstallModeScaffold TemplateInstallMode = "scaffold" +) + +// AllValues returns all TemplateInstallMode values. +func (TemplateInstallMode) AllValues() []TemplateInstallMode { + return []TemplateInstallMode{ + TemplateInstallModeDeploy, + TemplateInstallModeScaffold, + } +} + +// MarshalText implements encoding.TextMarshaler. +func (s TemplateInstallMode) MarshalText() ([]byte, error) { + switch s { + case TemplateInstallModeDeploy: + return []byte(s), nil + case TemplateInstallModeScaffold: + return []byte(s), nil + default: + return nil, errors.Errorf("invalid value: %q", s) + } +} + +// UnmarshalText implements encoding.TextUnmarshaler. +func (s *TemplateInstallMode) UnmarshalText(data []byte) error { + switch TemplateInstallMode(data) { + case TemplateInstallModeDeploy: + *s = TemplateInstallModeDeploy + return nil + case TemplateInstallModeScaffold: + *s = TemplateInstallModeScaffold + return nil + default: + return errors.Errorf("invalid value: %q", data) + } +} + +// Ref: #/components/schemas/TemplateInstallState +type TemplateInstallState string + +const ( + TemplateInstallStateDeploying TemplateInstallState = "deploying" + TemplateInstallStateConnecting TemplateInstallState = "connecting" + TemplateInstallStateBound TemplateInstallState = "bound" + TemplateInstallStateTested TemplateInstallState = "tested" + TemplateInstallStateDeployFailed TemplateInstallState = "deploy_failed" + TemplateInstallStateBindFailed TemplateInstallState = "bind_failed" + TemplateInstallStateTestFailed TemplateInstallState = "test_failed" +) + +// AllValues returns all TemplateInstallState values. +func (TemplateInstallState) AllValues() []TemplateInstallState { + return []TemplateInstallState{ + TemplateInstallStateDeploying, + TemplateInstallStateConnecting, + TemplateInstallStateBound, + TemplateInstallStateTested, + TemplateInstallStateDeployFailed, + TemplateInstallStateBindFailed, + TemplateInstallStateTestFailed, + } +} + +// MarshalText implements encoding.TextMarshaler. +func (s TemplateInstallState) MarshalText() ([]byte, error) { + switch s { + case TemplateInstallStateDeploying: + return []byte(s), nil + case TemplateInstallStateConnecting: + return []byte(s), nil + case TemplateInstallStateBound: + return []byte(s), nil + case TemplateInstallStateTested: + return []byte(s), nil + case TemplateInstallStateDeployFailed: + return []byte(s), nil + case TemplateInstallStateBindFailed: + return []byte(s), nil + case TemplateInstallStateTestFailed: + return []byte(s), nil + default: + return nil, errors.Errorf("invalid value: %q", s) + } +} + +// UnmarshalText implements encoding.TextUnmarshaler. +func (s *TemplateInstallState) UnmarshalText(data []byte) error { + switch TemplateInstallState(data) { + case TemplateInstallStateDeploying: + *s = TemplateInstallStateDeploying + return nil + case TemplateInstallStateConnecting: + *s = TemplateInstallStateConnecting + return nil + case TemplateInstallStateBound: + *s = TemplateInstallStateBound + return nil + case TemplateInstallStateTested: + *s = TemplateInstallStateTested + return nil + case TemplateInstallStateDeployFailed: + *s = TemplateInstallStateDeployFailed + return nil + case TemplateInstallStateBindFailed: + *s = TemplateInstallStateBindFailed + return nil + case TemplateInstallStateTestFailed: + *s = TemplateInstallStateTestFailed + return nil + default: + return errors.Errorf("invalid value: %q", data) + } +} + +// Ref: #/components/schemas/TemplateInstallStatus +type TemplateInstallStatus struct { + ID uuid.UUID `json:"id"` + // Template slug for this install. + TemplateSlug string `json:"template_slug"` + State TemplateInstallState `json:"state"` + Address NilString `json:"address"` + FunctionID NilUUID `json:"function_id"` + Error NilString `json:"error"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` +} + +// GetID returns the value of ID. +func (s *TemplateInstallStatus) GetID() uuid.UUID { + return s.ID +} + +// GetTemplateSlug returns the value of TemplateSlug. +func (s *TemplateInstallStatus) GetTemplateSlug() string { + return s.TemplateSlug +} + +// GetState returns the value of State. +func (s *TemplateInstallStatus) GetState() TemplateInstallState { + return s.State +} + +// GetAddress returns the value of Address. +func (s *TemplateInstallStatus) GetAddress() NilString { + return s.Address +} + +// GetFunctionID returns the value of FunctionID. +func (s *TemplateInstallStatus) GetFunctionID() NilUUID { + return s.FunctionID +} + +// GetError returns the value of Error. +func (s *TemplateInstallStatus) GetError() NilString { + return s.Error +} + +// GetCreatedAt returns the value of CreatedAt. +func (s *TemplateInstallStatus) GetCreatedAt() time.Time { + return s.CreatedAt +} + +// GetUpdatedAt returns the value of UpdatedAt. +func (s *TemplateInstallStatus) GetUpdatedAt() time.Time { + return s.UpdatedAt +} + +// SetID sets the value of ID. +func (s *TemplateInstallStatus) SetID(val uuid.UUID) { + s.ID = val +} + +// SetTemplateSlug sets the value of TemplateSlug. +func (s *TemplateInstallStatus) SetTemplateSlug(val string) { + s.TemplateSlug = val +} + +// SetState sets the value of State. +func (s *TemplateInstallStatus) SetState(val TemplateInstallState) { + s.State = val +} + +// SetAddress sets the value of Address. +func (s *TemplateInstallStatus) SetAddress(val NilString) { + s.Address = val +} + +// SetFunctionID sets the value of FunctionID. +func (s *TemplateInstallStatus) SetFunctionID(val NilUUID) { + s.FunctionID = val +} + +// SetError sets the value of Error. +func (s *TemplateInstallStatus) SetError(val NilString) { + s.Error = val +} + +// SetCreatedAt sets the value of CreatedAt. +func (s *TemplateInstallStatus) SetCreatedAt(val time.Time) { + s.CreatedAt = val +} + +// SetUpdatedAt sets the value of UpdatedAt. +func (s *TemplateInstallStatus) SetUpdatedAt(val time.Time) { + s.UpdatedAt = val +} + +// Ref: #/components/schemas/TemplateManifest +type TemplateManifest struct { + SchemaVersion int `json:"schemaVersion"` + // Stable template slug from the manifest. + ID string `json:"id"` + Title string `json:"title"` + Summary string `json:"summary"` + Description OptString `json:"description"` + Author TemplateAuthor `json:"author"` + Tags []string `json:"tags"` + Source TemplateSource `json:"source"` + Install TemplateInstall `json:"install"` + Secrets []TemplateSecret `json:"secrets"` + SecretGroups []TemplateSecretGroup `json:"secretGroups"` + Variables []TemplateVariable `json:"variables"` + Setup OptTemplateSetup `json:"setup"` + PostInstall OptString `json:"postInstall"` +} + +// GetSchemaVersion returns the value of SchemaVersion. +func (s *TemplateManifest) GetSchemaVersion() int { + return s.SchemaVersion +} + +// GetID returns the value of ID. +func (s *TemplateManifest) GetID() string { + return s.ID +} + +// GetTitle returns the value of Title. +func (s *TemplateManifest) GetTitle() string { + return s.Title +} + +// GetSummary returns the value of Summary. +func (s *TemplateManifest) GetSummary() string { + return s.Summary +} + +// GetDescription returns the value of Description. +func (s *TemplateManifest) GetDescription() OptString { + return s.Description +} + +// GetAuthor returns the value of Author. +func (s *TemplateManifest) GetAuthor() TemplateAuthor { + return s.Author +} + +// GetTags returns the value of Tags. +func (s *TemplateManifest) GetTags() []string { + return s.Tags +} + +// GetSource returns the value of Source. +func (s *TemplateManifest) GetSource() TemplateSource { + return s.Source +} + +// GetInstall returns the value of Install. +func (s *TemplateManifest) GetInstall() TemplateInstall { + return s.Install +} + +// GetSecrets returns the value of Secrets. +func (s *TemplateManifest) GetSecrets() []TemplateSecret { + return s.Secrets +} + +// GetSecretGroups returns the value of SecretGroups. +func (s *TemplateManifest) GetSecretGroups() []TemplateSecretGroup { + return s.SecretGroups +} + +// GetVariables returns the value of Variables. +func (s *TemplateManifest) GetVariables() []TemplateVariable { + return s.Variables +} + +// GetSetup returns the value of Setup. +func (s *TemplateManifest) GetSetup() OptTemplateSetup { + return s.Setup +} + +// GetPostInstall returns the value of PostInstall. +func (s *TemplateManifest) GetPostInstall() OptString { + return s.PostInstall +} + +// SetSchemaVersion sets the value of SchemaVersion. +func (s *TemplateManifest) SetSchemaVersion(val int) { + s.SchemaVersion = val +} + +// SetID sets the value of ID. +func (s *TemplateManifest) SetID(val string) { + s.ID = val +} + +// SetTitle sets the value of Title. +func (s *TemplateManifest) SetTitle(val string) { + s.Title = val +} + +// SetSummary sets the value of Summary. +func (s *TemplateManifest) SetSummary(val string) { + s.Summary = val +} + +// SetDescription sets the value of Description. +func (s *TemplateManifest) SetDescription(val OptString) { + s.Description = val +} + +// SetAuthor sets the value of Author. +func (s *TemplateManifest) SetAuthor(val TemplateAuthor) { + s.Author = val +} + +// SetTags sets the value of Tags. +func (s *TemplateManifest) SetTags(val []string) { + s.Tags = val +} + +// SetSource sets the value of Source. +func (s *TemplateManifest) SetSource(val TemplateSource) { + s.Source = val +} + +// SetInstall sets the value of Install. +func (s *TemplateManifest) SetInstall(val TemplateInstall) { + s.Install = val +} + +// SetSecrets sets the value of Secrets. +func (s *TemplateManifest) SetSecrets(val []TemplateSecret) { + s.Secrets = val +} + +// SetSecretGroups sets the value of SecretGroups. +func (s *TemplateManifest) SetSecretGroups(val []TemplateSecretGroup) { + s.SecretGroups = val +} + +// SetVariables sets the value of Variables. +func (s *TemplateManifest) SetVariables(val []TemplateVariable) { + s.Variables = val +} + +// SetSetup sets the value of Setup. +func (s *TemplateManifest) SetSetup(val OptTemplateSetup) { + s.Setup = val +} + +// SetPostInstall sets the value of PostInstall. +func (s *TemplateManifest) SetPostInstall(val OptString) { + s.PostInstall = val +} + +// Ref: #/components/schemas/TemplateRegistryDetail +type TemplateRegistryDetail struct { + ID uuid.UUID `json:"id"` + // Stable template slug used in template URLs and install commands. + Slug string `json:"slug"` + Title string `json:"title"` + Summary string `json:"summary"` + Author TemplateAuthor `json:"author"` + Tags []string `json:"tags"` + Verified bool `json:"verified"` + InstallCount int `json:"install_count"` + // GitHub repository in owner/repo form. + GithubRepo string `json:"github_repo"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + Description NilString `json:"description"` + GithubSha string `json:"github_sha"` + GithubPath NilString `json:"github_path"` + Manifest TemplateManifest `json:"manifest"` + Readme NilString `json:"readme"` + Status TemplateRegistryStatus `json:"status"` +} + +// GetID returns the value of ID. +func (s *TemplateRegistryDetail) GetID() uuid.UUID { + return s.ID +} + +// GetSlug returns the value of Slug. +func (s *TemplateRegistryDetail) GetSlug() string { + return s.Slug +} + +// GetTitle returns the value of Title. +func (s *TemplateRegistryDetail) GetTitle() string { + return s.Title +} + +// GetSummary returns the value of Summary. +func (s *TemplateRegistryDetail) GetSummary() string { + return s.Summary +} + +// GetAuthor returns the value of Author. +func (s *TemplateRegistryDetail) GetAuthor() TemplateAuthor { + return s.Author +} + +// GetTags returns the value of Tags. +func (s *TemplateRegistryDetail) GetTags() []string { + return s.Tags +} + +// GetVerified returns the value of Verified. +func (s *TemplateRegistryDetail) GetVerified() bool { + return s.Verified +} + +// GetInstallCount returns the value of InstallCount. +func (s *TemplateRegistryDetail) GetInstallCount() int { + return s.InstallCount +} + +// GetGithubRepo returns the value of GithubRepo. +func (s *TemplateRegistryDetail) GetGithubRepo() string { + return s.GithubRepo +} + +// GetCreatedAt returns the value of CreatedAt. +func (s *TemplateRegistryDetail) GetCreatedAt() time.Time { + return s.CreatedAt +} + +// GetUpdatedAt returns the value of UpdatedAt. +func (s *TemplateRegistryDetail) GetUpdatedAt() time.Time { + return s.UpdatedAt +} + +// GetDescription returns the value of Description. +func (s *TemplateRegistryDetail) GetDescription() NilString { + return s.Description +} + +// GetGithubSha returns the value of GithubSha. +func (s *TemplateRegistryDetail) GetGithubSha() string { + return s.GithubSha +} + +// GetGithubPath returns the value of GithubPath. +func (s *TemplateRegistryDetail) GetGithubPath() NilString { + return s.GithubPath +} + +// GetManifest returns the value of Manifest. +func (s *TemplateRegistryDetail) GetManifest() TemplateManifest { + return s.Manifest +} + +// GetReadme returns the value of Readme. +func (s *TemplateRegistryDetail) GetReadme() NilString { + return s.Readme +} + +// GetStatus returns the value of Status. +func (s *TemplateRegistryDetail) GetStatus() TemplateRegistryStatus { + return s.Status +} + +// SetID sets the value of ID. +func (s *TemplateRegistryDetail) SetID(val uuid.UUID) { + s.ID = val +} + +// SetSlug sets the value of Slug. +func (s *TemplateRegistryDetail) SetSlug(val string) { + s.Slug = val +} + +// SetTitle sets the value of Title. +func (s *TemplateRegistryDetail) SetTitle(val string) { + s.Title = val +} + +// SetSummary sets the value of Summary. +func (s *TemplateRegistryDetail) SetSummary(val string) { + s.Summary = val +} + +// SetAuthor sets the value of Author. +func (s *TemplateRegistryDetail) SetAuthor(val TemplateAuthor) { + s.Author = val +} + +// SetTags sets the value of Tags. +func (s *TemplateRegistryDetail) SetTags(val []string) { + s.Tags = val +} + +// SetVerified sets the value of Verified. +func (s *TemplateRegistryDetail) SetVerified(val bool) { + s.Verified = val +} + +// SetInstallCount sets the value of InstallCount. +func (s *TemplateRegistryDetail) SetInstallCount(val int) { + s.InstallCount = val +} + +// SetGithubRepo sets the value of GithubRepo. +func (s *TemplateRegistryDetail) SetGithubRepo(val string) { + s.GithubRepo = val +} + +// SetCreatedAt sets the value of CreatedAt. +func (s *TemplateRegistryDetail) SetCreatedAt(val time.Time) { + s.CreatedAt = val +} + +// SetUpdatedAt sets the value of UpdatedAt. +func (s *TemplateRegistryDetail) SetUpdatedAt(val time.Time) { + s.UpdatedAt = val +} + +// SetDescription sets the value of Description. +func (s *TemplateRegistryDetail) SetDescription(val NilString) { + s.Description = val +} + +// SetGithubSha sets the value of GithubSha. +func (s *TemplateRegistryDetail) SetGithubSha(val string) { + s.GithubSha = val +} + +// SetGithubPath sets the value of GithubPath. +func (s *TemplateRegistryDetail) SetGithubPath(val NilString) { + s.GithubPath = val +} + +// SetManifest sets the value of Manifest. +func (s *TemplateRegistryDetail) SetManifest(val TemplateManifest) { + s.Manifest = val +} + +// SetReadme sets the value of Readme. +func (s *TemplateRegistryDetail) SetReadme(val NilString) { + s.Readme = val +} + +// SetStatus sets the value of Status. +func (s *TemplateRegistryDetail) SetStatus(val TemplateRegistryStatus) { + s.Status = val +} + +// Ref: #/components/schemas/TemplateRegistryPage +type TemplateRegistryPage struct { + Items []TemplateRegistrySummary `json:"items"` + // Cursor to pass as the next `cursor` query value, or null when there are no more templates. + NextCursor NilString `json:"next_cursor"` +} + +// GetItems returns the value of Items. +func (s *TemplateRegistryPage) GetItems() []TemplateRegistrySummary { + return s.Items +} + +// GetNextCursor returns the value of NextCursor. +func (s *TemplateRegistryPage) GetNextCursor() NilString { + return s.NextCursor +} + +// SetItems sets the value of Items. +func (s *TemplateRegistryPage) SetItems(val []TemplateRegistrySummary) { + s.Items = val +} + +// SetNextCursor sets the value of NextCursor. +func (s *TemplateRegistryPage) SetNextCursor(val NilString) { + s.NextCursor = val +} + +// Ref: #/components/schemas/TemplateRegistryStatus +type TemplateRegistryStatus string + +const ( + TemplateRegistryStatusPending TemplateRegistryStatus = "pending" + TemplateRegistryStatusApproved TemplateRegistryStatus = "approved" + TemplateRegistryStatusRejected TemplateRegistryStatus = "rejected" +) + +// AllValues returns all TemplateRegistryStatus values. +func (TemplateRegistryStatus) AllValues() []TemplateRegistryStatus { + return []TemplateRegistryStatus{ + TemplateRegistryStatusPending, + TemplateRegistryStatusApproved, + TemplateRegistryStatusRejected, + } +} + +// MarshalText implements encoding.TextMarshaler. +func (s TemplateRegistryStatus) MarshalText() ([]byte, error) { + switch s { + case TemplateRegistryStatusPending: + return []byte(s), nil + case TemplateRegistryStatusApproved: + return []byte(s), nil + case TemplateRegistryStatusRejected: + return []byte(s), nil + default: + return nil, errors.Errorf("invalid value: %q", s) + } +} + +// UnmarshalText implements encoding.TextUnmarshaler. +func (s *TemplateRegistryStatus) UnmarshalText(data []byte) error { + switch TemplateRegistryStatus(data) { + case TemplateRegistryStatusPending: + *s = TemplateRegistryStatusPending + return nil + case TemplateRegistryStatusApproved: + *s = TemplateRegistryStatusApproved + return nil + case TemplateRegistryStatusRejected: + *s = TemplateRegistryStatusRejected + return nil + default: + return errors.Errorf("invalid value: %q", data) + } +} + +// Ref: #/components/schemas/TemplateRegistrySummary +type TemplateRegistrySummary struct { + ID uuid.UUID `json:"id"` + // Stable template slug used in template URLs and install commands. + Slug string `json:"slug"` + Title string `json:"title"` + Summary string `json:"summary"` + Author TemplateAuthor `json:"author"` + Tags []string `json:"tags"` + Verified bool `json:"verified"` + InstallCount int `json:"install_count"` + // GitHub repository in owner/repo form. + GithubRepo string `json:"github_repo"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` +} + +// GetID returns the value of ID. +func (s *TemplateRegistrySummary) GetID() uuid.UUID { + return s.ID +} + +// GetSlug returns the value of Slug. +func (s *TemplateRegistrySummary) GetSlug() string { + return s.Slug +} + +// GetTitle returns the value of Title. +func (s *TemplateRegistrySummary) GetTitle() string { + return s.Title +} + +// GetSummary returns the value of Summary. +func (s *TemplateRegistrySummary) GetSummary() string { + return s.Summary +} + +// GetAuthor returns the value of Author. +func (s *TemplateRegistrySummary) GetAuthor() TemplateAuthor { + return s.Author +} + +// GetTags returns the value of Tags. +func (s *TemplateRegistrySummary) GetTags() []string { + return s.Tags +} + +// GetVerified returns the value of Verified. +func (s *TemplateRegistrySummary) GetVerified() bool { + return s.Verified +} + +// GetInstallCount returns the value of InstallCount. +func (s *TemplateRegistrySummary) GetInstallCount() int { + return s.InstallCount +} + +// GetGithubRepo returns the value of GithubRepo. +func (s *TemplateRegistrySummary) GetGithubRepo() string { + return s.GithubRepo +} + +// GetCreatedAt returns the value of CreatedAt. +func (s *TemplateRegistrySummary) GetCreatedAt() time.Time { + return s.CreatedAt +} + +// GetUpdatedAt returns the value of UpdatedAt. +func (s *TemplateRegistrySummary) GetUpdatedAt() time.Time { + return s.UpdatedAt +} + +// SetID sets the value of ID. +func (s *TemplateRegistrySummary) SetID(val uuid.UUID) { + s.ID = val +} + +// SetSlug sets the value of Slug. +func (s *TemplateRegistrySummary) SetSlug(val string) { + s.Slug = val +} + +// SetTitle sets the value of Title. +func (s *TemplateRegistrySummary) SetTitle(val string) { + s.Title = val +} + +// SetSummary sets the value of Summary. +func (s *TemplateRegistrySummary) SetSummary(val string) { + s.Summary = val +} + +// SetAuthor sets the value of Author. +func (s *TemplateRegistrySummary) SetAuthor(val TemplateAuthor) { + s.Author = val +} + +// SetTags sets the value of Tags. +func (s *TemplateRegistrySummary) SetTags(val []string) { + s.Tags = val +} + +// SetVerified sets the value of Verified. +func (s *TemplateRegistrySummary) SetVerified(val bool) { + s.Verified = val +} + +// SetInstallCount sets the value of InstallCount. +func (s *TemplateRegistrySummary) SetInstallCount(val int) { + s.InstallCount = val +} + +// SetGithubRepo sets the value of GithubRepo. +func (s *TemplateRegistrySummary) SetGithubRepo(val string) { + s.GithubRepo = val +} + +// SetCreatedAt sets the value of CreatedAt. +func (s *TemplateRegistrySummary) SetCreatedAt(val time.Time) { + s.CreatedAt = val +} + +// SetUpdatedAt sets the value of UpdatedAt. +func (s *TemplateRegistrySummary) SetUpdatedAt(val time.Time) { + s.UpdatedAt = val +} + +// Ref: #/components/schemas/TemplateSecret +type TemplateSecret struct { + Key string `json:"key"` + Required bool `json:"required"` + Description OptString `json:"description"` +} + +// GetKey returns the value of Key. +func (s *TemplateSecret) GetKey() string { + return s.Key +} + +// GetRequired returns the value of Required. +func (s *TemplateSecret) GetRequired() bool { + return s.Required +} + +// GetDescription returns the value of Description. +func (s *TemplateSecret) GetDescription() OptString { + return s.Description +} + +// SetKey sets the value of Key. +func (s *TemplateSecret) SetKey(val string) { + s.Key = val +} + +// SetRequired sets the value of Required. +func (s *TemplateSecret) SetRequired(val bool) { + s.Required = val +} + +// SetDescription sets the value of Description. +func (s *TemplateSecret) SetDescription(val OptString) { + s.Description = val +} + +// Ref: #/components/schemas/TemplateSecretGroup +type TemplateSecretGroup struct { + Keys []string `json:"keys"` + Min int `json:"min"` + Description OptString `json:"description"` +} + +// GetKeys returns the value of Keys. +func (s *TemplateSecretGroup) GetKeys() []string { + return s.Keys +} + +// GetMin returns the value of Min. +func (s *TemplateSecretGroup) GetMin() int { + return s.Min +} + +// GetDescription returns the value of Description. +func (s *TemplateSecretGroup) GetDescription() OptString { + return s.Description +} + +// SetKeys sets the value of Keys. +func (s *TemplateSecretGroup) SetKeys(val []string) { + s.Keys = val +} + +// SetMin sets the value of Min. +func (s *TemplateSecretGroup) SetMin(val int) { + s.Min = val +} + +// SetDescription sets the value of Description. +func (s *TemplateSecretGroup) SetDescription(val OptString) { + s.Description = val +} + +// Ref: #/components/schemas/TemplateSetup +type TemplateSetup struct { + Agent string `json:"agent"` + Prompt string `json:"prompt"` + Produces []string `json:"produces"` +} + +// GetAgent returns the value of Agent. +func (s *TemplateSetup) GetAgent() string { + return s.Agent +} + +// GetPrompt returns the value of Prompt. +func (s *TemplateSetup) GetPrompt() string { + return s.Prompt +} + +// GetProduces returns the value of Produces. +func (s *TemplateSetup) GetProduces() []string { + return s.Produces +} + +// SetAgent sets the value of Agent. +func (s *TemplateSetup) SetAgent(val string) { + s.Agent = val +} + +// SetPrompt sets the value of Prompt. +func (s *TemplateSetup) SetPrompt(val string) { + s.Prompt = val +} + +// SetProduces sets the value of Produces. +func (s *TemplateSetup) SetProduces(val []string) { + s.Produces = val +} + +// Ref: #/components/schemas/TemplateSource +// TemplateSource represents sum type. +type TemplateSource struct { + Type TemplateSourceType // switch on this field + TemplateSource0 TemplateSource0 + TemplateSource1 TemplateSource1 +} + +// TemplateSourceType is oneOf type of TemplateSource. +type TemplateSourceType string + +// Possible values for TemplateSourceType. +const ( + TemplateSource0TemplateSource TemplateSourceType = "TemplateSource0" + TemplateSource1TemplateSource TemplateSourceType = "TemplateSource1" +) + +// IsTemplateSource0 reports whether TemplateSource is TemplateSource0. +func (s TemplateSource) IsTemplateSource0() bool { return s.Type == TemplateSource0TemplateSource } + +// IsTemplateSource1 reports whether TemplateSource is TemplateSource1. +func (s TemplateSource) IsTemplateSource1() bool { return s.Type == TemplateSource1TemplateSource } + +// SetTemplateSource0 sets TemplateSource to TemplateSource0. +func (s *TemplateSource) SetTemplateSource0(v TemplateSource0) { + s.Type = TemplateSource0TemplateSource + s.TemplateSource0 = v +} + +// GetTemplateSource0 returns TemplateSource0 and true boolean if TemplateSource is TemplateSource0. +func (s TemplateSource) GetTemplateSource0() (v TemplateSource0, ok bool) { + if !s.IsTemplateSource0() { + return v, false + } + return s.TemplateSource0, true +} + +// NewTemplateSource0TemplateSource returns new TemplateSource from TemplateSource0. +func NewTemplateSource0TemplateSource(v TemplateSource0) TemplateSource { + var s TemplateSource + s.SetTemplateSource0(v) + return s +} + +// SetTemplateSource1 sets TemplateSource to TemplateSource1. +func (s *TemplateSource) SetTemplateSource1(v TemplateSource1) { + s.Type = TemplateSource1TemplateSource + s.TemplateSource1 = v +} + +// GetTemplateSource1 returns TemplateSource1 and true boolean if TemplateSource is TemplateSource1. +func (s TemplateSource) GetTemplateSource1() (v TemplateSource1, ok bool) { + if !s.IsTemplateSource1() { + return v, false + } + return s.TemplateSource1, true +} + +// NewTemplateSource1TemplateSource returns new TemplateSource from TemplateSource1. +func NewTemplateSource1TemplateSource(v TemplateSource1) TemplateSource { + var s TemplateSource + s.SetTemplateSource1(v) + return s +} + +type TemplateSource0 struct { + Mode string `json:"mode"` + Dir string `json:"dir"` +} + +// GetMode returns the value of Mode. +func (s *TemplateSource0) GetMode() string { + return s.Mode +} + +// GetDir returns the value of Dir. +func (s *TemplateSource0) GetDir() string { + return s.Dir +} + +// SetMode sets the value of Mode. +func (s *TemplateSource0) SetMode(val string) { + s.Mode = val +} + +// SetDir sets the value of Dir. +func (s *TemplateSource0) SetDir(val string) { + s.Dir = val +} + +type TemplateSource1 struct { + Mode string `json:"mode"` + File string `json:"file"` +} + +// GetMode returns the value of Mode. +func (s *TemplateSource1) GetMode() string { + return s.Mode +} + +// GetFile returns the value of File. +func (s *TemplateSource1) GetFile() string { + return s.File +} + +// SetMode sets the value of Mode. +func (s *TemplateSource1) SetMode(val string) { + s.Mode = val +} + +// SetFile sets the value of File. +func (s *TemplateSource1) SetFile(val string) { + s.File = val +} + +// Ref: #/components/schemas/TemplateVariable +type TemplateVariable struct { + Key string `json:"key"` + Prompt string `json:"prompt"` + Default OptString `json:"default"` + File OptString `json:"file"` + Type TemplateVariableType `json:"type"` + Options []string `json:"options"` + Validation OptTemplateVariableValidation `json:"validation"` +} + +// GetKey returns the value of Key. +func (s *TemplateVariable) GetKey() string { + return s.Key +} + +// GetPrompt returns the value of Prompt. +func (s *TemplateVariable) GetPrompt() string { + return s.Prompt +} + +// GetDefault returns the value of Default. +func (s *TemplateVariable) GetDefault() OptString { + return s.Default +} + +// GetFile returns the value of File. +func (s *TemplateVariable) GetFile() OptString { + return s.File +} + +// GetType returns the value of Type. +func (s *TemplateVariable) GetType() TemplateVariableType { + return s.Type +} + +// GetOptions returns the value of Options. +func (s *TemplateVariable) GetOptions() []string { + return s.Options +} + +// GetValidation returns the value of Validation. +func (s *TemplateVariable) GetValidation() OptTemplateVariableValidation { + return s.Validation +} + +// SetKey sets the value of Key. +func (s *TemplateVariable) SetKey(val string) { + s.Key = val +} + +// SetPrompt sets the value of Prompt. +func (s *TemplateVariable) SetPrompt(val string) { + s.Prompt = val +} + +// SetDefault sets the value of Default. +func (s *TemplateVariable) SetDefault(val OptString) { + s.Default = val +} + +// SetFile sets the value of File. +func (s *TemplateVariable) SetFile(val OptString) { + s.File = val +} + +// SetType sets the value of Type. +func (s *TemplateVariable) SetType(val TemplateVariableType) { + s.Type = val +} + +// SetOptions sets the value of Options. +func (s *TemplateVariable) SetOptions(val []string) { + s.Options = val +} + +// SetValidation sets the value of Validation. +func (s *TemplateVariable) SetValidation(val OptTemplateVariableValidation) { + s.Validation = val +} + +type TemplateVariableType string + +const ( + TemplateVariableTypeString TemplateVariableType = "string" + TemplateVariableTypeSelect TemplateVariableType = "select" + TemplateVariableTypeURL TemplateVariableType = "url" + TemplateVariableTypeEmail TemplateVariableType = "email" +) + +// AllValues returns all TemplateVariableType values. +func (TemplateVariableType) AllValues() []TemplateVariableType { + return []TemplateVariableType{ + TemplateVariableTypeString, + TemplateVariableTypeSelect, + TemplateVariableTypeURL, + TemplateVariableTypeEmail, + } +} + +// MarshalText implements encoding.TextMarshaler. +func (s TemplateVariableType) MarshalText() ([]byte, error) { + switch s { + case TemplateVariableTypeString: + return []byte(s), nil + case TemplateVariableTypeSelect: + return []byte(s), nil + case TemplateVariableTypeURL: + return []byte(s), nil + case TemplateVariableTypeEmail: + return []byte(s), nil + default: + return nil, errors.Errorf("invalid value: %q", s) + } +} + +// UnmarshalText implements encoding.TextUnmarshaler. +func (s *TemplateVariableType) UnmarshalText(data []byte) error { + switch TemplateVariableType(data) { + case TemplateVariableTypeString: + *s = TemplateVariableTypeString + return nil + case TemplateVariableTypeSelect: + *s = TemplateVariableTypeSelect + return nil + case TemplateVariableTypeURL: + *s = TemplateVariableTypeURL + return nil + case TemplateVariableTypeEmail: + *s = TemplateVariableTypeEmail + return nil + default: + return errors.Errorf("invalid value: %q", data) + } +} + +// Ref: #/components/schemas/TemplateVariableValidation +type TemplateVariableValidation struct { + Pattern OptString `json:"pattern"` + MaxLength OptInt `json:"maxLength"` +} + +// GetPattern returns the value of Pattern. +func (s *TemplateVariableValidation) GetPattern() OptString { + return s.Pattern +} + +// GetMaxLength returns the value of MaxLength. +func (s *TemplateVariableValidation) GetMaxLength() OptInt { + return s.MaxLength +} + +// SetPattern sets the value of Pattern. +func (s *TemplateVariableValidation) SetPattern(val OptString) { + s.Pattern = val +} + +// SetMaxLength sets the value of MaxLength. +func (s *TemplateVariableValidation) SetMaxLength(val OptInt) { + s.MaxLength = val +} + type TestEndpointBadRequest ErrorResponse func (*TestEndpointBadRequest) testEndpointRes() {} diff --git a/sdk-go/api/oas_security_gen.go b/sdk-go/api/oas_security_gen.go index c4189ef..5538dc9 100644 --- a/sdk-go/api/oas_security_gen.go +++ b/sdk-go/api/oas_security_gen.go @@ -84,9 +84,11 @@ var operationRolesBearerAuth = map[string][]string{ GetSentEmailOperation: []string{}, GetSpendPolicyOperation: []string{}, GetStorageStatsOperation: []string{}, + GetTemplateInstallOperation: []string{}, GetThreadOperation: []string{}, GetWakeScheduleOperation: []string{}, GetWebhookSecretOperation: []string{}, + InstallTemplateOperation: []string{}, ListDeclinedPaymentsOperation: []string{}, ListDeliveriesOperation: []string{}, ListDomainsOperation: []string{}, diff --git a/sdk-go/api/oas_server_gen.go b/sdk-go/api/oas_server_gen.go index 615f73e..1ccf384 100644 --- a/sdk-go/api/oas_server_gen.go +++ b/sdk-go/api/oas_server_gen.go @@ -522,6 +522,21 @@ type Handler interface { // // GET /account/storage GetStorageStats(ctx context.Context) (GetStorageStatsRes, error) + // GetTemplate implements getTemplate operation. + // + // Fetch one approved Function template by slug, including its manifest + // snapshot and README. The stored source files used for install are not + // returned. + // + // GET /templates/{id} + GetTemplate(ctx context.Context, params GetTemplateParams) (GetTemplateRes, error) + // GetTemplateInstall implements getTemplateInstall operation. + // + // Fetch the current state of a template install. Reads may advance the + // self-test phase when a reply effect has been observed. + // + // GET /templates/installs/{id} + GetTemplateInstall(ctx context.Context, params GetTemplateInstallParams) (GetTemplateInstallRes, error) // GetThread implements getThread operation. // // Returns a conversation thread: its metadata plus the inbound @@ -566,6 +581,14 @@ type Handler interface { // // GET /account/webhook-secret GetWebhookSecret(ctx context.Context) (GetWebhookSecretRes, error) + // InstallTemplate implements installTemplate operation. + // + // Start a one-shot deploy of an approved deploy-mode Function template. + // The response returns an install record immediately; poll + // `GET /templates/installs/{id}` for progress. + // + // POST /templates/{id}/install + InstallTemplate(ctx context.Context, req *InstallTemplateBody, params InstallTemplateParams) (InstallTemplateRes, error) // ListDeclinedPayments implements listDeclinedPayments operation. // // The 50 most recent payments your org's spend policy declined, newest @@ -716,6 +739,14 @@ type Handler interface { // // GET /sent-emails ListSentEmails(ctx context.Context, params ListSentEmailsParams) (ListSentEmailsRes, error) + // ListTemplates implements listTemplates operation. + // + // List approved Function templates available for browsing and + // installation. Results are cacheable and paginated with + // `data.next_cursor`. + // + // GET /templates + ListTemplates(ctx context.Context, params ListTemplatesParams) (ListTemplatesRes, error) // ListWakeAuthorizations implements listWakeAuthorizations operation. // // Returns the per-target allowlist grants that authorize which senders may diff --git a/sdk-go/api/oas_unimplemented_gen.go b/sdk-go/api/oas_unimplemented_gen.go index 69d1085..81549a1 100644 --- a/sdk-go/api/oas_unimplemented_gen.go +++ b/sdk-go/api/oas_unimplemented_gen.go @@ -674,6 +674,27 @@ func (UnimplementedHandler) GetStorageStats(ctx context.Context) (r GetStorageSt return r, ht.ErrNotImplemented } +// GetTemplate implements getTemplate operation. +// +// Fetch one approved Function template by slug, including its manifest +// snapshot and README. The stored source files used for install are not +// returned. +// +// GET /templates/{id} +func (UnimplementedHandler) GetTemplate(ctx context.Context, params GetTemplateParams) (r GetTemplateRes, _ error) { + return r, ht.ErrNotImplemented +} + +// GetTemplateInstall implements getTemplateInstall operation. +// +// Fetch the current state of a template install. Reads may advance the +// self-test phase when a reply effect has been observed. +// +// GET /templates/installs/{id} +func (UnimplementedHandler) GetTemplateInstall(ctx context.Context, params GetTemplateInstallParams) (r GetTemplateInstallRes, _ error) { + return r, ht.ErrNotImplemented +} + // GetThread implements getThread operation. // // Returns a conversation thread: its metadata plus the inbound @@ -727,6 +748,17 @@ func (UnimplementedHandler) GetWebhookSecret(ctx context.Context) (r GetWebhookS return r, ht.ErrNotImplemented } +// InstallTemplate implements installTemplate operation. +// +// Start a one-shot deploy of an approved deploy-mode Function template. +// The response returns an install record immediately; poll +// `GET /templates/installs/{id}` for progress. +// +// POST /templates/{id}/install +func (UnimplementedHandler) InstallTemplate(ctx context.Context, req *InstallTemplateBody, params InstallTemplateParams) (r InstallTemplateRes, _ error) { + return r, ht.ErrNotImplemented +} + // ListDeclinedPayments implements listDeclinedPayments operation. // // The 50 most recent payments your org's spend policy declined, newest @@ -925,6 +957,17 @@ func (UnimplementedHandler) ListSentEmails(ctx context.Context, params ListSentE return r, ht.ErrNotImplemented } +// ListTemplates implements listTemplates operation. +// +// List approved Function templates available for browsing and +// installation. Results are cacheable and paginated with +// `data.next_cursor`. +// +// GET /templates +func (UnimplementedHandler) ListTemplates(ctx context.Context, params ListTemplatesParams) (r ListTemplatesRes, _ error) { + return r, ht.ErrNotImplemented +} + // ListWakeAuthorizations implements listWakeAuthorizations operation. // // Returns the per-target allowlist grants that authorize which senders may diff --git a/sdk-go/api/oas_validators_gen.go b/sdk-go/api/oas_validators_gen.go index dc8e45d..da4a784 100644 --- a/sdk-go/api/oas_validators_gen.go +++ b/sdk-go/api/oas_validators_gen.go @@ -4139,6 +4139,26 @@ func (s ErrorResponseErrorCode) Validate() error { return nil case "memory_conflict": return nil + case "template_not_installable": + return nil + case "scaffold_only": + return nil + case "invalid_variables": + return nil + case "unknown_secrets": + return nil + case "missing_secrets": + return nil + case "no_inbound_domain": + return nil + case "domain_cannot_send": + return nil + case "address_taken": + return nil + case "route_cap_reached": + return nil + case "name_exhausted": + return nil case "developer_usage_credit_exhausted": return nil case "no_payout_address": @@ -5495,6 +5515,100 @@ func (s *GetStorageStatsUnauthorized) Validate() error { return nil } +func (s *GetTemplateBadRequest) Validate() error { + alias := (*ErrorResponse)(s) + if err := alias.Validate(); err != nil { + return err + } + return nil +} + +func (s *GetTemplateInstallBadRequest) Validate() error { + alias := (*ErrorResponse)(s) + if err := alias.Validate(); err != nil { + return err + } + return nil +} + +func (s *GetTemplateInstallForbidden) Validate() error { + alias := (*ErrorResponse)(s) + if err := alias.Validate(); err != nil { + return err + } + return nil +} + +func (s *GetTemplateInstallNotFound) Validate() error { + alias := (*ErrorResponse)(s) + if err := alias.Validate(); err != nil { + return err + } + return nil +} + +func (s *GetTemplateInstallOK) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Data.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "data", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *GetTemplateInstallUnauthorized) Validate() error { + alias := (*ErrorResponse)(s) + if err := alias.Validate(); err != nil { + return err + } + return nil +} + +func (s *GetTemplateNotFound) Validate() error { + alias := (*ErrorResponse)(s) + if err := alias.Validate(); err != nil { + return err + } + return nil +} + +func (s *GetTemplateOK) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Data.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "data", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + func (s *GetThreadBadRequest) Validate() error { alias := (*ErrorResponse)(s) if err := alias.Validate(); err != nil { @@ -5720,6 +5834,149 @@ func (s InboxStatusNextActionKind) Validate() error { } } +func (s *InstallTemplateBadRequest) Validate() error { + alias := (*ErrorResponse)(s) + if err := alias.Validate(); err != nil { + return err + } + return nil +} + +func (s *InstallTemplateBody) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if value, ok := s.Address.Get(); ok { + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: false, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: regexMap["^[a-z0-9][a-z0-9._-]{0,63}$"], + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(value)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "address", + Error: err, + }) + } + if err := func() error { + if value, ok := s.Domain.Get(); ok { + if err := func() error { + if err := (validate.String{ + MinLength: 3, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(value)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "domain", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *InstallTemplateConflict) Validate() error { + alias := (*ErrorResponse)(s) + if err := alias.Validate(); err != nil { + return err + } + return nil +} + +func (s *InstallTemplateCreated) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Data.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "data", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *InstallTemplateForbidden) Validate() error { + alias := (*ErrorResponse)(s) + if err := alias.Validate(); err != nil { + return err + } + return nil +} + +func (s *InstallTemplateNotFound) Validate() error { + alias := (*ErrorResponse)(s) + if err := alias.Validate(); err != nil { + return err + } + return nil +} + +func (s *InstallTemplateUnauthorized) Validate() error { + alias := (*ErrorResponse)(s) + if err := alias.Validate(); err != nil { + return err + } + return nil +} + +func (s *InstallTemplateUnprocessableEntity) Validate() error { + alias := (*ErrorResponse)(s) + if err := alias.Validate(); err != nil { + return err + } + return nil +} + func (s *ListDeclinedPaymentsForbidden) Validate() error { alias := (*ErrorResponse)(s) if err := alias.Validate(); err != nil { @@ -6537,6 +6794,29 @@ func (s *ListSentEmailsUnauthorized) Validate() error { return nil } +func (s *ListTemplatesOK) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Data.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "data", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + func (s *ListWakeAuthorizationsBadRequest) Validate() error { alias := (*ErrorResponse)(s) if err := alias.Validate(); err != nil { @@ -11247,6 +11527,1278 @@ func (s *StorageStats) Validate() error { return nil } +func (s *TemplateAuthor) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.String{ + MinLength: 1, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(s.ID)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "id", + Error: err, + }) + } + if err := func() error { + if err := (validate.String{ + MinLength: 1, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(s.Name)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "name", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *TemplateInstall) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Mode.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "mode", + Error: err, + }) + } + if err := func() error { + if s.EditFiles == nil { + return errors.New("nil is invalid value") + } + var failures []validate.FieldError + for i, elem := range s.EditFiles { + if err := func() error { + if err := (validate.String{ + MinLength: 1, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(elem)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "editFiles", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s TemplateInstallMode) Validate() error { + switch s { + case "deploy": + return nil + case "scaffold": + return nil + default: + return errors.Errorf("invalid value: %v", s) + } +} + +func (s TemplateInstallState) Validate() error { + switch s { + case "deploying": + return nil + case "connecting": + return nil + case "bound": + return nil + case "tested": + return nil + case "deploy_failed": + return nil + case "bind_failed": + return nil + case "test_failed": + return nil + default: + return errors.Errorf("invalid value: %v", s) + } +} + +func (s *TemplateInstallStatus) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: false, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: regexMap["^[a-z0-9][a-z0-9_-]{0,62}$"], + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(s.TemplateSlug)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "template_slug", + Error: err, + }) + } + if err := func() error { + if err := s.State.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "state", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *TemplateManifest) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: false, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: regexMap["^[a-z0-9][a-z0-9_-]{0,62}$"], + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(s.ID)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "id", + Error: err, + }) + } + if err := func() error { + if err := (validate.String{ + MinLength: 1, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(s.Title)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "title", + Error: err, + }) + } + if err := func() error { + if err := (validate.String{ + MinLength: 1, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(s.Summary)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "summary", + Error: err, + }) + } + if err := func() error { + if err := s.Author.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "author", + Error: err, + }) + } + if err := func() error { + if s.Tags == nil { + return errors.New("nil is invalid value") + } + var failures []validate.FieldError + for i, elem := range s.Tags { + if err := func() error { + if err := (validate.String{ + MinLength: 1, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(elem)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "tags", + Error: err, + }) + } + if err := func() error { + if err := s.Source.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "source", + Error: err, + }) + } + if err := func() error { + if err := s.Install.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "install", + Error: err, + }) + } + if err := func() error { + if s.Secrets == nil { + return errors.New("nil is invalid value") + } + var failures []validate.FieldError + for i, elem := range s.Secrets { + if err := func() error { + if err := elem.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "secrets", + Error: err, + }) + } + if err := func() error { + if s.SecretGroups == nil { + return errors.New("nil is invalid value") + } + var failures []validate.FieldError + for i, elem := range s.SecretGroups { + if err := func() error { + if err := elem.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "secretGroups", + Error: err, + }) + } + if err := func() error { + if s.Variables == nil { + return errors.New("nil is invalid value") + } + var failures []validate.FieldError + for i, elem := range s.Variables { + if err := func() error { + if err := elem.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "variables", + Error: err, + }) + } + if err := func() error { + if value, ok := s.Setup.Get(); ok { + if err := func() error { + if err := value.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "setup", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *TemplateRegistryDetail) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: false, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: regexMap["^[a-z0-9][a-z0-9_-]{0,62}$"], + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(s.Slug)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "slug", + Error: err, + }) + } + if err := func() error { + if err := s.Author.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "author", + Error: err, + }) + } + if err := func() error { + if s.Tags == nil { + return errors.New("nil is invalid value") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "tags", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + Pattern: nil, + }).Validate(int64(s.InstallCount)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "install_count", + Error: err, + }) + } + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: false, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: regexMap["^[A-Za-z0-9-]+/[A-Za-z0-9_.-]+$"], + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(s.GithubRepo)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "github_repo", + Error: err, + }) + } + if err := func() error { + if err := s.Manifest.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "manifest", + Error: err, + }) + } + if err := func() error { + if err := s.Status.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "status", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *TemplateRegistryPage) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if s.Items == nil { + return errors.New("nil is invalid value") + } + var failures []validate.FieldError + for i, elem := range s.Items { + if err := func() error { + if err := elem.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "items", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s TemplateRegistryStatus) Validate() error { + switch s { + case "pending": + return nil + case "approved": + return nil + case "rejected": + return nil + default: + return errors.Errorf("invalid value: %v", s) + } +} + +func (s *TemplateRegistrySummary) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: false, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: regexMap["^[a-z0-9][a-z0-9_-]{0,62}$"], + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(s.Slug)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "slug", + Error: err, + }) + } + if err := func() error { + if err := s.Author.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "author", + Error: err, + }) + } + if err := func() error { + if s.Tags == nil { + return errors.New("nil is invalid value") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "tags", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + Pattern: nil, + }).Validate(int64(s.InstallCount)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "install_count", + Error: err, + }) + } + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: false, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: regexMap["^[A-Za-z0-9-]+/[A-Za-z0-9_.-]+$"], + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(s.GithubRepo)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "github_repo", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *TemplateSecret) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: false, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: regexMap["^[A-Z_][A-Z0-9_]*$"], + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(s.Key)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "key", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *TemplateSecretGroup) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if s.Keys == nil { + return errors.New("nil is invalid value") + } + if err := (validate.Array{ + MinLength: 2, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + }).ValidateLength(len(s.Keys)); err != nil { + return errors.Wrap(err, "array") + } + var failures []validate.FieldError + for i, elem := range s.Keys { + if err := func() error { + if err := (validate.String{ + MinLength: 0, + MinLengthSet: false, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: regexMap["^[A-Z_][A-Z0-9_]*$"], + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(elem)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "keys", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 1, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + Pattern: nil, + }).Validate(int64(s.Min)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "min", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *TemplateSetup) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.String{ + MinLength: 1, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(s.Agent)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "agent", + Error: err, + }) + } + if err := func() error { + if err := (validate.String{ + MinLength: 1, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(s.Prompt)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "prompt", + Error: err, + }) + } + if err := func() error { + if s.Produces == nil { + return errors.New("nil is invalid value") + } + var failures []validate.FieldError + for i, elem := range s.Produces { + if err := func() error { + if err := (validate.String{ + MinLength: 1, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(elem)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "produces", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s TemplateSource) Validate() error { + switch s.Type { + case TemplateSource0TemplateSource: + if err := s.TemplateSource0.Validate(); err != nil { + return err + } + return nil + case TemplateSource1TemplateSource: + if err := s.TemplateSource1.Validate(); err != nil { + return err + } + return nil + default: + return errors.Errorf("invalid type %q", s.Type) + } +} + +func (s *TemplateSource0) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.String{ + MinLength: 1, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(s.Dir)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "dir", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *TemplateSource1) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.String{ + MinLength: 1, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(s.File)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "file", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *TemplateVariable) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.String{ + MinLength: 1, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(s.Key)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "key", + Error: err, + }) + } + if err := func() error { + if err := (validate.String{ + MinLength: 1, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(s.Prompt)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "prompt", + Error: err, + }) + } + if err := func() error { + if value, ok := s.File.Get(); ok { + if err := func() error { + if err := (validate.String{ + MinLength: 1, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(value)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "file", + Error: err, + }) + } + if err := func() error { + if err := s.Type.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "type", + Error: err, + }) + } + if err := func() error { + var failures []validate.FieldError + for i, elem := range s.Options { + if err := func() error { + if err := (validate.String{ + MinLength: 1, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(elem)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "options", + Error: err, + }) + } + if err := func() error { + if value, ok := s.Validation.Get(); ok { + if err := func() error { + if err := value.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "validation", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s TemplateVariableType) Validate() error { + switch s { + case "string": + return nil + case "select": + return nil + case "url": + return nil + case "email": + return nil + default: + return errors.Errorf("invalid value: %v", s) + } +} + +func (s *TemplateVariableValidation) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if value, ok := s.Pattern.Get(); ok { + if err := func() error { + if err := (validate.String{ + MinLength: 1, + MinLengthSet: true, + MaxLength: 0, + MaxLengthSet: false, + Email: false, + Hostname: false, + Regex: nil, + MinNumeric: 0, + MinNumericSet: false, + MaxNumeric: 0, + MaxNumericSet: false, + }).Validate(string(value)); err != nil { + return errors.Wrap(err, "string") + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "pattern", + Error: err, + }) + } + if err := func() error { + if value, ok := s.MaxLength.Get(); ok { + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 1, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + Pattern: nil, + }).Validate(int64(value)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "maxLength", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + func (s *TestEndpointBadRequest) Validate() error { alias := (*ErrorResponse)(s) if err := alias.Validate(); err != nil { diff --git a/sdk-python/src/primitive/api/api/templates/__init__.py b/sdk-python/src/primitive/api/api/templates/__init__.py new file mode 100644 index 0000000..c9921b5 --- /dev/null +++ b/sdk-python/src/primitive/api/api/templates/__init__.py @@ -0,0 +1 @@ +""" Contains endpoint functions for accessing the API """ diff --git a/sdk-python/src/primitive/api/api/templates/get_template.py b/sdk-python/src/primitive/api/api/templates/get_template.py new file mode 100644 index 0000000..f99694d --- /dev/null +++ b/sdk-python/src/primitive/api/api/templates/get_template.py @@ -0,0 +1,209 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ...client import AuthenticatedClient, Client +from ...types import Response, UNSET +from ... import errors + +from ...models.error_response import ErrorResponse +from ...models.get_template_response_200 import GetTemplateResponse200 +from typing import cast + + + +def _get_kwargs( + id: str, + +) -> dict[str, Any]: + + + + + + + _kwargs: dict[str, Any] = { + "method": "get", + "url": "/templates/{id}".format(id=quote(str(id), safe=""),), + } + + + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> ErrorResponse | GetTemplateResponse200 | None: + if response.status_code == 200: + response_200 = GetTemplateResponse200.from_dict(response.json()) + + + + return response_200 + + if response.status_code == 400: + response_400 = ErrorResponse.from_dict(response.json()) + + + + return response_400 + + if response.status_code == 404: + response_404 = ErrorResponse.from_dict(response.json()) + + + + return response_404 + + if response.status_code == 429: + response_429 = ErrorResponse.from_dict(response.json()) + + + + return response_429 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[ErrorResponse | GetTemplateResponse200]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + id: str, + *, + client: AuthenticatedClient | Client, + +) -> Response[ErrorResponse | GetTemplateResponse200]: + """ Get a function template + + Fetch one approved Function template by slug, including its manifest + snapshot and README. The stored source files used for install are not + returned. + + Args: + id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorResponse | GetTemplateResponse200] + """ + + + kwargs = _get_kwargs( + id=id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + id: str, + *, + client: AuthenticatedClient | Client, + +) -> ErrorResponse | GetTemplateResponse200 | None: + """ Get a function template + + Fetch one approved Function template by slug, including its manifest + snapshot and README. The stored source files used for install are not + returned. + + Args: + id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorResponse | GetTemplateResponse200 + """ + + + return sync_detailed( + id=id, +client=client, + + ).parsed + +async def asyncio_detailed( + id: str, + *, + client: AuthenticatedClient | Client, + +) -> Response[ErrorResponse | GetTemplateResponse200]: + """ Get a function template + + Fetch one approved Function template by slug, including its manifest + snapshot and README. The stored source files used for install are not + returned. + + Args: + id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorResponse | GetTemplateResponse200] + """ + + + kwargs = _get_kwargs( + id=id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + id: str, + *, + client: AuthenticatedClient | Client, + +) -> ErrorResponse | GetTemplateResponse200 | None: + """ Get a function template + + Fetch one approved Function template by slug, including its manifest + snapshot and README. The stored source files used for install are not + returned. + + Args: + id (str): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorResponse | GetTemplateResponse200 + """ + + + return (await asyncio_detailed( + id=id, +client=client, + + )).parsed diff --git a/sdk-python/src/primitive/api/api/templates/get_template_install.py b/sdk-python/src/primitive/api/api/templates/get_template_install.py new file mode 100644 index 0000000..952ccd9 --- /dev/null +++ b/sdk-python/src/primitive/api/api/templates/get_template_install.py @@ -0,0 +1,220 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ...client import AuthenticatedClient, Client +from ...types import Response, UNSET +from ... import errors + +from ...models.error_response import ErrorResponse +from ...models.get_template_install_response_200 import GetTemplateInstallResponse200 +from typing import cast +from uuid import UUID + + + +def _get_kwargs( + id: UUID, + +) -> dict[str, Any]: + + + + + + + _kwargs: dict[str, Any] = { + "method": "get", + "url": "/templates/installs/{id}".format(id=quote(str(id), safe=""),), + } + + + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> ErrorResponse | GetTemplateInstallResponse200 | None: + if response.status_code == 200: + response_200 = GetTemplateInstallResponse200.from_dict(response.json()) + + + + return response_200 + + if response.status_code == 400: + response_400 = ErrorResponse.from_dict(response.json()) + + + + return response_400 + + if response.status_code == 401: + response_401 = ErrorResponse.from_dict(response.json()) + + + + return response_401 + + if response.status_code == 403: + response_403 = ErrorResponse.from_dict(response.json()) + + + + return response_403 + + if response.status_code == 404: + response_404 = ErrorResponse.from_dict(response.json()) + + + + return response_404 + + if response.status_code == 429: + response_429 = ErrorResponse.from_dict(response.json()) + + + + return response_429 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[ErrorResponse | GetTemplateInstallResponse200]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + id: UUID, + *, + client: AuthenticatedClient, + +) -> Response[ErrorResponse | GetTemplateInstallResponse200]: + """ Get template install status + + Fetch the current state of a template install. Reads may advance the + self-test phase when a reply effect has been observed. + + Args: + id (UUID): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorResponse | GetTemplateInstallResponse200] + """ + + + kwargs = _get_kwargs( + id=id, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + id: UUID, + *, + client: AuthenticatedClient, + +) -> ErrorResponse | GetTemplateInstallResponse200 | None: + """ Get template install status + + Fetch the current state of a template install. Reads may advance the + self-test phase when a reply effect has been observed. + + Args: + id (UUID): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorResponse | GetTemplateInstallResponse200 + """ + + + return sync_detailed( + id=id, +client=client, + + ).parsed + +async def asyncio_detailed( + id: UUID, + *, + client: AuthenticatedClient, + +) -> Response[ErrorResponse | GetTemplateInstallResponse200]: + """ Get template install status + + Fetch the current state of a template install. Reads may advance the + self-test phase when a reply effect has been observed. + + Args: + id (UUID): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorResponse | GetTemplateInstallResponse200] + """ + + + kwargs = _get_kwargs( + id=id, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + id: UUID, + *, + client: AuthenticatedClient, + +) -> ErrorResponse | GetTemplateInstallResponse200 | None: + """ Get template install status + + Fetch the current state of a template install. Reads may advance the + self-test phase when a reply effect has been observed. + + Args: + id (UUID): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorResponse | GetTemplateInstallResponse200 + """ + + + return (await asyncio_detailed( + id=id, +client=client, + + )).parsed diff --git a/sdk-python/src/primitive/api/api/templates/install_template.py b/sdk-python/src/primitive/api/api/templates/install_template.py new file mode 100644 index 0000000..aa79072 --- /dev/null +++ b/sdk-python/src/primitive/api/api/templates/install_template.py @@ -0,0 +1,258 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ...client import AuthenticatedClient, Client +from ...types import Response, UNSET +from ... import errors + +from ...models.error_response import ErrorResponse +from ...models.install_template_body import InstallTemplateBody +from ...models.install_template_response_201 import InstallTemplateResponse201 +from typing import cast + + + +def _get_kwargs( + id: str, + *, + body: InstallTemplateBody, + +) -> dict[str, Any]: + headers: dict[str, Any] = {} + + + + + + + _kwargs: dict[str, Any] = { + "method": "post", + "url": "/templates/{id}/install".format(id=quote(str(id), safe=""),), + } + + _kwargs["json"] = body.to_dict() + + + headers["Content-Type"] = "application/json" + + _kwargs["headers"] = headers + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> ErrorResponse | InstallTemplateResponse201 | None: + if response.status_code == 201: + response_201 = InstallTemplateResponse201.from_dict(response.json()) + + + + return response_201 + + if response.status_code == 400: + response_400 = ErrorResponse.from_dict(response.json()) + + + + return response_400 + + if response.status_code == 401: + response_401 = ErrorResponse.from_dict(response.json()) + + + + return response_401 + + if response.status_code == 403: + response_403 = ErrorResponse.from_dict(response.json()) + + + + return response_403 + + if response.status_code == 404: + response_404 = ErrorResponse.from_dict(response.json()) + + + + return response_404 + + if response.status_code == 409: + response_409 = ErrorResponse.from_dict(response.json()) + + + + return response_409 + + if response.status_code == 422: + response_422 = ErrorResponse.from_dict(response.json()) + + + + return response_422 + + if response.status_code == 429: + response_429 = ErrorResponse.from_dict(response.json()) + + + + return response_429 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[ErrorResponse | InstallTemplateResponse201]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + id: str, + *, + client: AuthenticatedClient, + body: InstallTemplateBody, + +) -> Response[ErrorResponse | InstallTemplateResponse201]: + """ Install a function template + + Start a one-shot deploy of an approved deploy-mode Function template. + The response returns an install record immediately; poll + `GET /templates/installs/{id}` for progress. + + Args: + id (str): + body (InstallTemplateBody): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorResponse | InstallTemplateResponse201] + """ + + + kwargs = _get_kwargs( + id=id, +body=body, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + id: str, + *, + client: AuthenticatedClient, + body: InstallTemplateBody, + +) -> ErrorResponse | InstallTemplateResponse201 | None: + """ Install a function template + + Start a one-shot deploy of an approved deploy-mode Function template. + The response returns an install record immediately; poll + `GET /templates/installs/{id}` for progress. + + Args: + id (str): + body (InstallTemplateBody): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorResponse | InstallTemplateResponse201 + """ + + + return sync_detailed( + id=id, +client=client, +body=body, + + ).parsed + +async def asyncio_detailed( + id: str, + *, + client: AuthenticatedClient, + body: InstallTemplateBody, + +) -> Response[ErrorResponse | InstallTemplateResponse201]: + """ Install a function template + + Start a one-shot deploy of an approved deploy-mode Function template. + The response returns an install record immediately; poll + `GET /templates/installs/{id}` for progress. + + Args: + id (str): + body (InstallTemplateBody): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorResponse | InstallTemplateResponse201] + """ + + + kwargs = _get_kwargs( + id=id, +body=body, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + id: str, + *, + client: AuthenticatedClient, + body: InstallTemplateBody, + +) -> ErrorResponse | InstallTemplateResponse201 | None: + """ Install a function template + + Start a one-shot deploy of an approved deploy-mode Function template. + The response returns an install record immediately; poll + `GET /templates/installs/{id}` for progress. + + Args: + id (str): + body (InstallTemplateBody): + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorResponse | InstallTemplateResponse201 + """ + + + return (await asyncio_detailed( + id=id, +client=client, +body=body, + + )).parsed diff --git a/sdk-python/src/primitive/api/api/templates/list_templates.py b/sdk-python/src/primitive/api/api/templates/list_templates.py new file mode 100644 index 0000000..eebd089 --- /dev/null +++ b/sdk-python/src/primitive/api/api/templates/list_templates.py @@ -0,0 +1,256 @@ +from http import HTTPStatus +from typing import Any, cast +from urllib.parse import quote + +import httpx + +from ...client import AuthenticatedClient, Client +from ...types import Response, UNSET +from ... import errors + +from ...models.error_response import ErrorResponse +from ...models.list_templates_response_200 import ListTemplatesResponse200 +from ...types import UNSET, Unset +from typing import cast + + + +def _get_kwargs( + *, + q: str | Unset = UNSET, + tag: str | Unset = UNSET, + cursor: str | Unset = UNSET, + limit: int | Unset = 50, + +) -> dict[str, Any]: + + + + + params: dict[str, Any] = {} + + params["q"] = q + + params["tag"] = tag + + params["cursor"] = cursor + + params["limit"] = limit + + + params = {k: v for k, v in params.items() if v is not UNSET and v is not None} + + + _kwargs: dict[str, Any] = { + "method": "get", + "url": "/templates", + "params": params, + } + + + return _kwargs + + + +def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> ErrorResponse | ListTemplatesResponse200 | None: + if response.status_code == 200: + response_200 = ListTemplatesResponse200.from_dict(response.json()) + + + + return response_200 + + if response.status_code == 400: + response_400 = ErrorResponse.from_dict(response.json()) + + + + return response_400 + + if response.status_code == 429: + response_429 = ErrorResponse.from_dict(response.json()) + + + + return response_429 + + if client.raise_on_unexpected_status: + raise errors.UnexpectedStatus(response.status_code, response.content) + else: + return None + + +def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[ErrorResponse | ListTemplatesResponse200]: + return Response( + status_code=HTTPStatus(response.status_code), + content=response.content, + headers=response.headers, + parsed=_parse_response(client=client, response=response), + ) + + +def sync_detailed( + *, + client: AuthenticatedClient | Client, + q: str | Unset = UNSET, + tag: str | Unset = UNSET, + cursor: str | Unset = UNSET, + limit: int | Unset = 50, + +) -> Response[ErrorResponse | ListTemplatesResponse200]: + """ List function templates + + List approved Function templates available for browsing and + installation. Results are cacheable and paginated with + `data.next_cursor`. + + Args: + q (str | Unset): + tag (str | Unset): + cursor (str | Unset): + limit (int | Unset): Default: 50. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorResponse | ListTemplatesResponse200] + """ + + + kwargs = _get_kwargs( + q=q, +tag=tag, +cursor=cursor, +limit=limit, + + ) + + response = client.get_httpx_client().request( + **kwargs, + ) + + return _build_response(client=client, response=response) + +def sync( + *, + client: AuthenticatedClient | Client, + q: str | Unset = UNSET, + tag: str | Unset = UNSET, + cursor: str | Unset = UNSET, + limit: int | Unset = 50, + +) -> ErrorResponse | ListTemplatesResponse200 | None: + """ List function templates + + List approved Function templates available for browsing and + installation. Results are cacheable and paginated with + `data.next_cursor`. + + Args: + q (str | Unset): + tag (str | Unset): + cursor (str | Unset): + limit (int | Unset): Default: 50. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorResponse | ListTemplatesResponse200 + """ + + + return sync_detailed( + client=client, +q=q, +tag=tag, +cursor=cursor, +limit=limit, + + ).parsed + +async def asyncio_detailed( + *, + client: AuthenticatedClient | Client, + q: str | Unset = UNSET, + tag: str | Unset = UNSET, + cursor: str | Unset = UNSET, + limit: int | Unset = 50, + +) -> Response[ErrorResponse | ListTemplatesResponse200]: + """ List function templates + + List approved Function templates available for browsing and + installation. Results are cacheable and paginated with + `data.next_cursor`. + + Args: + q (str | Unset): + tag (str | Unset): + cursor (str | Unset): + limit (int | Unset): Default: 50. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + Response[ErrorResponse | ListTemplatesResponse200] + """ + + + kwargs = _get_kwargs( + q=q, +tag=tag, +cursor=cursor, +limit=limit, + + ) + + response = await client.get_async_httpx_client().request( + **kwargs + ) + + return _build_response(client=client, response=response) + +async def asyncio( + *, + client: AuthenticatedClient | Client, + q: str | Unset = UNSET, + tag: str | Unset = UNSET, + cursor: str | Unset = UNSET, + limit: int | Unset = 50, + +) -> ErrorResponse | ListTemplatesResponse200 | None: + """ List function templates + + List approved Function templates available for browsing and + installation. Results are cacheable and paginated with + `data.next_cursor`. + + Args: + q (str | Unset): + tag (str | Unset): + cursor (str | Unset): + limit (int | Unset): Default: 50. + + Raises: + errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True. + httpx.TimeoutException: If the request takes longer than Client.timeout. + + Returns: + ErrorResponse | ListTemplatesResponse200 + """ + + + return (await asyncio_detailed( + client=client, +q=q, +tag=tag, +cursor=cursor, +limit=limit, + + )).parsed diff --git a/sdk-python/src/primitive/api/models/__init__.py b/sdk-python/src/primitive/api/models/__init__.py index 1322798..73f6883 100644 --- a/sdk-python/src/primitive/api/models/__init__.py +++ b/sdk-python/src/primitive/api/models/__init__.py @@ -193,6 +193,8 @@ from .get_sent_email_response_200 import GetSentEmailResponse200 from .get_spend_policy_response_200 import GetSpendPolicyResponse200 from .get_storage_stats_response_200 import GetStorageStatsResponse200 +from .get_template_install_response_200 import GetTemplateInstallResponse200 +from .get_template_response_200 import GetTemplateResponse200 from .get_thread_response_200 import GetThreadResponse200 from .get_wake_schedule_response_200 import GetWakeScheduleResponse200 from .get_webhook_secret_response_200 import GetWebhookSecretResponse200 @@ -204,6 +206,10 @@ from .inbox_status_next_action import InboxStatusNextAction from .inbox_status_next_action_kind import InboxStatusNextActionKind from .inbox_status_recent_email_summary import InboxStatusRecentEmailSummary +from .install_template_body import InstallTemplateBody +from .install_template_body_secrets import InstallTemplateBodySecrets +from .install_template_body_variables import InstallTemplateBodyVariables +from .install_template_response_201 import InstallTemplateResponse201 from .list_declined_payments_response_200 import ListDeclinedPaymentsResponse200 from .list_deliveries_response_200 import ListDeliveriesResponse200 from .list_deliveries_status import ListDeliveriesStatus @@ -225,6 +231,7 @@ from .list_registry_requests_response_200 import ListRegistryRequestsResponse200 from .list_routes_response_200 import ListRoutesResponse200 from .list_sent_emails_response_200 import ListSentEmailsResponse200 +from .list_templates_response_200 import ListTemplatesResponse200 from .list_wake_authorizations_response_200 import ListWakeAuthorizationsResponse200 from .list_wake_dispatches_response_200 import ListWakeDispatchesResponse200 from .list_wake_schedules_response_200 import ListWakeSchedulesResponse200 @@ -356,6 +363,24 @@ from .start_cli_signup_response_201 import StartCliSignupResponse201 from .storage_stats import StorageStats from .success_envelope import SuccessEnvelope +from .template_author import TemplateAuthor +from .template_install import TemplateInstall +from .template_install_mode import TemplateInstallMode +from .template_install_state import TemplateInstallState +from .template_install_status import TemplateInstallStatus +from .template_manifest import TemplateManifest +from .template_registry_detail import TemplateRegistryDetail +from .template_registry_page import TemplateRegistryPage +from .template_registry_status import TemplateRegistryStatus +from .template_registry_summary import TemplateRegistrySummary +from .template_secret import TemplateSecret +from .template_secret_group import TemplateSecretGroup +from .template_setup import TemplateSetup +from .template_source_type_0 import TemplateSourceType0 +from .template_source_type_1 import TemplateSourceType1 +from .template_variable import TemplateVariable +from .template_variable_type import TemplateVariableType +from .template_variable_validation import TemplateVariableValidation from .test_endpoint_response_200 import TestEndpointResponse200 from .test_function_body import TestFunctionBody from .test_function_response_200 import TestFunctionResponse200 @@ -622,6 +647,8 @@ "GetSentEmailResponse200", "GetSpendPolicyResponse200", "GetStorageStatsResponse200", + "GetTemplateInstallResponse200", + "GetTemplateResponse200", "GetThreadResponse200", "GetWakeScheduleResponse200", "GetWebhookSecretResponse200", @@ -633,6 +660,10 @@ "InboxStatusNextAction", "InboxStatusNextActionKind", "InboxStatusRecentEmailSummary", + "InstallTemplateBody", + "InstallTemplateBodySecrets", + "InstallTemplateBodyVariables", + "InstallTemplateResponse201", "ListDeclinedPaymentsResponse200", "ListDeliveriesResponse200", "ListDeliveriesStatus", @@ -654,6 +685,7 @@ "ListRegistryRequestsResponse200", "ListRoutesResponse200", "ListSentEmailsResponse200", + "ListTemplatesResponse200", "ListWakeAuthorizationsResponse200", "ListWakeDispatchesResponse200", "ListWakeSchedulesResponse200", @@ -785,6 +817,24 @@ "StartCliSignupResponse201", "StorageStats", "SuccessEnvelope", + "TemplateAuthor", + "TemplateInstall", + "TemplateInstallMode", + "TemplateInstallState", + "TemplateInstallStatus", + "TemplateManifest", + "TemplateRegistryDetail", + "TemplateRegistryPage", + "TemplateRegistryStatus", + "TemplateRegistrySummary", + "TemplateSecret", + "TemplateSecretGroup", + "TemplateSetup", + "TemplateSourceType0", + "TemplateSourceType1", + "TemplateVariable", + "TemplateVariableType", + "TemplateVariableValidation", "TestEndpointResponse200", "TestFunctionBody", "TestFunctionResponse200", diff --git a/sdk-python/src/primitive/api/models/error_response_error_code.py b/sdk-python/src/primitive/api/models/error_response_error_code.py index 6c96a57..44e571e 100644 --- a/sdk-python/src/primitive/api/models/error_response_error_code.py +++ b/sdk-python/src/primitive/api/models/error_response_error_code.py @@ -2,6 +2,7 @@ class ErrorResponseErrorCode(str, Enum): ACCESS_DENIED = "access_denied" + ADDRESS_TAKEN = "address_taken" AUTHORIZATION_PENDING = "authorization_pending" CANNOT_SEND_FROM_DOMAIN = "cannot_send_from_domain" CHALLENGE_EXPIRED = "challenge_expired" @@ -9,6 +10,7 @@ class ErrorResponseErrorCode(str, Enum): CONFLICT = "conflict" DEVELOPER_USAGE_CREDIT_EXHAUSTED = "developer_usage_credit_exhausted" DISCARD_NOT_ENABLED = "discard_not_enabled" + DOMAIN_CANNOT_SEND = "domain_cannot_send" EMAIL_DELIVERY_FAILED = "email_delivery_failed" EXPIRED_TOKEN = "expired_token" FEATURE_DISABLED = "feature_disabled" @@ -18,10 +20,14 @@ class ErrorResponseErrorCode(str, Enum): INVALID_DEVICE_CODE = "invalid_device_code" INVALID_SIGNUP_CODE = "invalid_signup_code" INVALID_SIGNUP_TOKEN = "invalid_signup_token" + INVALID_VARIABLES = "invalid_variables" INVALID_VERIFICATION_CODE = "invalid_verification_code" MEMORY_CONFLICT = "memory_conflict" + MISSING_SECRETS = "missing_secrets" MX_CONFLICT = "mx_conflict" + NAME_EXHAUSTED = "name_exhausted" NOT_FOUND = "not_found" + NO_INBOUND_DOMAIN = "no_inbound_domain" NO_ORGS_FOR_USER = "no_orgs_for_user" NO_PAYOUT_ADDRESS = "no_payout_address" ORG_NOT_ACCESSIBLE = "org_not_accessible" @@ -37,10 +43,14 @@ class ErrorResponseErrorCode(str, Enum): PAYMENT_VERIFICATION_FAILED = "payment_verification_failed" RATE_LIMIT_EXCEEDED = "rate_limit_exceeded" RECIPIENT_NOT_ALLOWED = "recipient_not_allowed" + ROUTE_CAP_REACHED = "route_cap_reached" + SCAFFOLD_ONLY = "scaffold_only" SEARCH_TIMEOUT = "search_timeout" SETTLEMENT_FAILED = "settlement_failed" SLOW_DOWN = "slow_down" + TEMPLATE_NOT_INSTALLABLE = "template_not_installable" UNAUTHORIZED = "unauthorized" + UNKNOWN_SECRETS = "unknown_secrets" VALIDATION_ERROR = "validation_error" def __str__(self) -> str: diff --git a/sdk-python/src/primitive/api/models/get_template_install_response_200.py b/sdk-python/src/primitive/api/models/get_template_install_response_200.py new file mode 100644 index 0000000..5a38a2e --- /dev/null +++ b/sdk-python/src/primitive/api/models/get_template_install_response_200.py @@ -0,0 +1,92 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + +if TYPE_CHECKING: + from ..models.template_install_status import TemplateInstallStatus + + + + + +T = TypeVar("T", bound="GetTemplateInstallResponse200") + + + +@_attrs_define +class GetTemplateInstallResponse200: + """ + Attributes: + success (bool): + data (TemplateInstallStatus): + """ + + success: bool + data: TemplateInstallStatus + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.template_install_status import TemplateInstallStatus + success = self.success + + data = self.data.to_dict() + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "success": success, + "data": data, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.template_install_status import TemplateInstallStatus + d = dict(src_dict) + success = d.pop("success") + + data = TemplateInstallStatus.from_dict(d.pop("data")) + + + + + get_template_install_response_200 = cls( + success=success, + data=data, + ) + + + get_template_install_response_200.additional_properties = d + return get_template_install_response_200 + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/sdk-python/src/primitive/api/models/get_template_response_200.py b/sdk-python/src/primitive/api/models/get_template_response_200.py new file mode 100644 index 0000000..3fb9478 --- /dev/null +++ b/sdk-python/src/primitive/api/models/get_template_response_200.py @@ -0,0 +1,92 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + +if TYPE_CHECKING: + from ..models.template_registry_detail import TemplateRegistryDetail + + + + + +T = TypeVar("T", bound="GetTemplateResponse200") + + + +@_attrs_define +class GetTemplateResponse200: + """ + Attributes: + success (bool): + data (TemplateRegistryDetail): + """ + + success: bool + data: TemplateRegistryDetail + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.template_registry_detail import TemplateRegistryDetail + success = self.success + + data = self.data.to_dict() + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "success": success, + "data": data, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.template_registry_detail import TemplateRegistryDetail + d = dict(src_dict) + success = d.pop("success") + + data = TemplateRegistryDetail.from_dict(d.pop("data")) + + + + + get_template_response_200 = cls( + success=success, + data=data, + ) + + + get_template_response_200.additional_properties = d + return get_template_response_200 + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/sdk-python/src/primitive/api/models/install_template_body.py b/sdk-python/src/primitive/api/models/install_template_body.py new file mode 100644 index 0000000..3a70c71 --- /dev/null +++ b/sdk-python/src/primitive/api/models/install_template_body.py @@ -0,0 +1,114 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + +if TYPE_CHECKING: + from ..models.install_template_body_secrets import InstallTemplateBodySecrets + from ..models.install_template_body_variables import InstallTemplateBodyVariables + + + + + +T = TypeVar("T", bound="InstallTemplateBody") + + + +@_attrs_define +class InstallTemplateBody: + """ + Attributes: + address (str | Unset): Localpart to claim on the selected inbound domain. Defaults to the template slug. + domain (str | Unset): Org domain name to claim the address on. Defaults to the org's newest active domain. + variables (InstallTemplateBodyVariables | Unset): Template variable values keyed by manifest variable key. + secrets (InstallTemplateBodySecrets | Unset): Secret values keyed by manifest secret key. + """ + + address: str | Unset = UNSET + domain: str | Unset = UNSET + variables: InstallTemplateBodyVariables | Unset = UNSET + secrets: InstallTemplateBodySecrets | Unset = UNSET + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.install_template_body_secrets import InstallTemplateBodySecrets + from ..models.install_template_body_variables import InstallTemplateBodyVariables + address = self.address + + domain = self.domain + + variables: dict[str, Any] | Unset = UNSET + if not isinstance(self.variables, Unset): + variables = self.variables.to_dict() + + secrets: dict[str, Any] | Unset = UNSET + if not isinstance(self.secrets, Unset): + secrets = self.secrets.to_dict() + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + }) + if address is not UNSET: + field_dict["address"] = address + if domain is not UNSET: + field_dict["domain"] = domain + if variables is not UNSET: + field_dict["variables"] = variables + if secrets is not UNSET: + field_dict["secrets"] = secrets + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.install_template_body_secrets import InstallTemplateBodySecrets + from ..models.install_template_body_variables import InstallTemplateBodyVariables + d = dict(src_dict) + address = d.pop("address", UNSET) + + domain = d.pop("domain", UNSET) + + _variables = d.pop("variables", UNSET) + variables: InstallTemplateBodyVariables | Unset + if isinstance(_variables, Unset): + variables = UNSET + else: + variables = InstallTemplateBodyVariables.from_dict(_variables) + + + + + _secrets = d.pop("secrets", UNSET) + secrets: InstallTemplateBodySecrets | Unset + if isinstance(_secrets, Unset): + secrets = UNSET + else: + secrets = InstallTemplateBodySecrets.from_dict(_secrets) + + + + + install_template_body = cls( + address=address, + domain=domain, + variables=variables, + secrets=secrets, + ) + + return install_template_body + diff --git a/sdk-python/src/primitive/api/models/install_template_body_secrets.py b/sdk-python/src/primitive/api/models/install_template_body_secrets.py new file mode 100644 index 0000000..e9c72a5 --- /dev/null +++ b/sdk-python/src/primitive/api/models/install_template_body_secrets.py @@ -0,0 +1,66 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + + + + + + + +T = TypeVar("T", bound="InstallTemplateBodySecrets") + + + +@_attrs_define +class InstallTemplateBodySecrets: + """ Secret values keyed by manifest secret key. + + """ + + additional_properties: dict[str, str] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + install_template_body_secrets = cls( + ) + + + install_template_body_secrets.additional_properties = d + return install_template_body_secrets + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> str: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: str) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/sdk-python/src/primitive/api/models/install_template_body_variables.py b/sdk-python/src/primitive/api/models/install_template_body_variables.py new file mode 100644 index 0000000..80cf3db --- /dev/null +++ b/sdk-python/src/primitive/api/models/install_template_body_variables.py @@ -0,0 +1,66 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + + + + + + + +T = TypeVar("T", bound="InstallTemplateBodyVariables") + + + +@_attrs_define +class InstallTemplateBodyVariables: + """ Template variable values keyed by manifest variable key. + + """ + + additional_properties: dict[str, str] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + install_template_body_variables = cls( + ) + + + install_template_body_variables.additional_properties = d + return install_template_body_variables + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> str: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: str) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/sdk-python/src/primitive/api/models/install_template_response_201.py b/sdk-python/src/primitive/api/models/install_template_response_201.py new file mode 100644 index 0000000..8b1ea89 --- /dev/null +++ b/sdk-python/src/primitive/api/models/install_template_response_201.py @@ -0,0 +1,92 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + +if TYPE_CHECKING: + from ..models.template_install_status import TemplateInstallStatus + + + + + +T = TypeVar("T", bound="InstallTemplateResponse201") + + + +@_attrs_define +class InstallTemplateResponse201: + """ + Attributes: + success (bool): + data (TemplateInstallStatus): + """ + + success: bool + data: TemplateInstallStatus + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.template_install_status import TemplateInstallStatus + success = self.success + + data = self.data.to_dict() + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "success": success, + "data": data, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.template_install_status import TemplateInstallStatus + d = dict(src_dict) + success = d.pop("success") + + data = TemplateInstallStatus.from_dict(d.pop("data")) + + + + + install_template_response_201 = cls( + success=success, + data=data, + ) + + + install_template_response_201.additional_properties = d + return install_template_response_201 + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/sdk-python/src/primitive/api/models/list_templates_response_200.py b/sdk-python/src/primitive/api/models/list_templates_response_200.py new file mode 100644 index 0000000..b2de0e9 --- /dev/null +++ b/sdk-python/src/primitive/api/models/list_templates_response_200.py @@ -0,0 +1,92 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + +if TYPE_CHECKING: + from ..models.template_registry_page import TemplateRegistryPage + + + + + +T = TypeVar("T", bound="ListTemplatesResponse200") + + + +@_attrs_define +class ListTemplatesResponse200: + """ + Attributes: + success (bool): + data (TemplateRegistryPage): + """ + + success: bool + data: TemplateRegistryPage + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.template_registry_page import TemplateRegistryPage + success = self.success + + data = self.data.to_dict() + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "success": success, + "data": data, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.template_registry_page import TemplateRegistryPage + d = dict(src_dict) + success = d.pop("success") + + data = TemplateRegistryPage.from_dict(d.pop("data")) + + + + + list_templates_response_200 = cls( + success=success, + data=data, + ) + + + list_templates_response_200.additional_properties = d + return list_templates_response_200 + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/sdk-python/src/primitive/api/models/template_author.py b/sdk-python/src/primitive/api/models/template_author.py new file mode 100644 index 0000000..a5d1b43 --- /dev/null +++ b/sdk-python/src/primitive/api/models/template_author.py @@ -0,0 +1,75 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + + + + + + + +T = TypeVar("T", bound="TemplateAuthor") + + + +@_attrs_define +class TemplateAuthor: + """ + Attributes: + id (str): + name (str): + url (str | Unset): + """ + + id: str + name: str + url: str | Unset = UNSET + + + + + + def to_dict(self) -> dict[str, Any]: + id = self.id + + name = self.name + + url = self.url + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "id": id, + "name": name, + }) + if url is not UNSET: + field_dict["url"] = url + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + id = d.pop("id") + + name = d.pop("name") + + url = d.pop("url", UNSET) + + template_author = cls( + id=id, + name=name, + url=url, + ) + + return template_author + diff --git a/sdk-python/src/primitive/api/models/template_install.py b/sdk-python/src/primitive/api/models/template_install.py new file mode 100644 index 0000000..90a919d --- /dev/null +++ b/sdk-python/src/primitive/api/models/template_install.py @@ -0,0 +1,82 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..models.template_install_mode import TemplateInstallMode +from typing import cast + + + + + + +T = TypeVar("T", bound="TemplateInstall") + + + +@_attrs_define +class TemplateInstall: + """ + Attributes: + mode (TemplateInstallMode): + edit_files (list[str]): + reason (str): Default: ''. + """ + + mode: TemplateInstallMode + edit_files: list[str] + reason: str = '' + + + + + + def to_dict(self) -> dict[str, Any]: + mode = self.mode.value + + edit_files = self.edit_files + + + + reason = self.reason + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "mode": mode, + "editFiles": edit_files, + "reason": reason, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + mode = TemplateInstallMode(d.pop("mode")) + + + + + edit_files = cast(list[str], d.pop("editFiles")) + + + reason = d.pop("reason") + + template_install = cls( + mode=mode, + edit_files=edit_files, + reason=reason, + ) + + return template_install + diff --git a/sdk-python/src/primitive/api/models/template_install_mode.py b/sdk-python/src/primitive/api/models/template_install_mode.py new file mode 100644 index 0000000..1f3f165 --- /dev/null +++ b/sdk-python/src/primitive/api/models/template_install_mode.py @@ -0,0 +1,8 @@ +from enum import Enum + +class TemplateInstallMode(str, Enum): + DEPLOY = "deploy" + SCAFFOLD = "scaffold" + + def __str__(self) -> str: + return str(self.value) diff --git a/sdk-python/src/primitive/api/models/template_install_state.py b/sdk-python/src/primitive/api/models/template_install_state.py new file mode 100644 index 0000000..cfb718b --- /dev/null +++ b/sdk-python/src/primitive/api/models/template_install_state.py @@ -0,0 +1,13 @@ +from enum import Enum + +class TemplateInstallState(str, Enum): + BIND_FAILED = "bind_failed" + BOUND = "bound" + CONNECTING = "connecting" + DEPLOYING = "deploying" + DEPLOY_FAILED = "deploy_failed" + TESTED = "tested" + TEST_FAILED = "test_failed" + + def __str__(self) -> str: + return str(self.value) diff --git a/sdk-python/src/primitive/api/models/template_install_status.py b/sdk-python/src/primitive/api/models/template_install_status.py new file mode 100644 index 0000000..2424e9a --- /dev/null +++ b/sdk-python/src/primitive/api/models/template_install_status.py @@ -0,0 +1,183 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..models.template_install_state import TemplateInstallState +from dateutil.parser import isoparse +from typing import cast +from uuid import UUID +import datetime + + + + + + +T = TypeVar("T", bound="TemplateInstallStatus") + + + +@_attrs_define +class TemplateInstallStatus: + """ + Attributes: + id (UUID): + template_slug (str): Template slug for this install. + state (TemplateInstallState): + address (None | str): + function_id (None | UUID): + error (None | str): + created_at (datetime.datetime): + updated_at (datetime.datetime): + """ + + id: UUID + template_slug: str + state: TemplateInstallState + address: None | str + function_id: None | UUID + error: None | str + created_at: datetime.datetime + updated_at: datetime.datetime + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + id = str(self.id) + + template_slug = self.template_slug + + state = self.state.value + + address: None | str + address = self.address + + function_id: None | str + if isinstance(self.function_id, UUID): + function_id = str(self.function_id) + else: + function_id = self.function_id + + error: None | str + error = self.error + + created_at = self.created_at.isoformat() + + updated_at = self.updated_at.isoformat() + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "id": id, + "template_slug": template_slug, + "state": state, + "address": address, + "function_id": function_id, + "error": error, + "created_at": created_at, + "updated_at": updated_at, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + id = UUID(d.pop("id")) + + + + + template_slug = d.pop("template_slug") + + state = TemplateInstallState(d.pop("state")) + + + + + def _parse_address(data: object) -> None | str: + if data is None: + return data + return cast(None | str, data) + + address = _parse_address(d.pop("address")) + + + def _parse_function_id(data: object) -> None | UUID: + if data is None: + return data + try: + if not isinstance(data, str): + raise TypeError() + function_id_type_0 = UUID(data) + + + + return function_id_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + return cast(None | UUID, data) + + function_id = _parse_function_id(d.pop("function_id")) + + + def _parse_error(data: object) -> None | str: + if data is None: + return data + return cast(None | str, data) + + error = _parse_error(d.pop("error")) + + + created_at = isoparse(d.pop("created_at")) + + + + + updated_at = isoparse(d.pop("updated_at")) + + + + + template_install_status = cls( + id=id, + template_slug=template_slug, + state=state, + address=address, + function_id=function_id, + error=error, + created_at=created_at, + updated_at=updated_at, + ) + + + template_install_status.additional_properties = d + return template_install_status + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/sdk-python/src/primitive/api/models/template_manifest.py b/sdk-python/src/primitive/api/models/template_manifest.py new file mode 100644 index 0000000..0e61a08 --- /dev/null +++ b/sdk-python/src/primitive/api/models/template_manifest.py @@ -0,0 +1,277 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast +from typing import Literal, cast + +if TYPE_CHECKING: + from ..models.template_author import TemplateAuthor + from ..models.template_install import TemplateInstall + from ..models.template_secret import TemplateSecret + from ..models.template_secret_group import TemplateSecretGroup + from ..models.template_setup import TemplateSetup + from ..models.template_source_type_0 import TemplateSourceType0 + from ..models.template_source_type_1 import TemplateSourceType1 + from ..models.template_variable import TemplateVariable + + + + + +T = TypeVar("T", bound="TemplateManifest") + + + +@_attrs_define +class TemplateManifest: + """ + Attributes: + schema_version (Literal[1]): + id (str): Stable template slug from the manifest. + title (str): + summary (str): + author (TemplateAuthor): + tags (list[str]): + source (TemplateSourceType0 | TemplateSourceType1): + install (TemplateInstall): + secrets (list[TemplateSecret]): + secret_groups (list[TemplateSecretGroup]): + variables (list[TemplateVariable]): + description (str | Unset): + setup (TemplateSetup | Unset): + post_install (str | Unset): + """ + + schema_version: Literal[1] + id: str + title: str + summary: str + author: TemplateAuthor + tags: list[str] + source: TemplateSourceType0 | TemplateSourceType1 + install: TemplateInstall + secrets: list[TemplateSecret] + secret_groups: list[TemplateSecretGroup] + variables: list[TemplateVariable] + description: str | Unset = UNSET + setup: TemplateSetup | Unset = UNSET + post_install: str | Unset = UNSET + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.template_author import TemplateAuthor + from ..models.template_install import TemplateInstall + from ..models.template_secret import TemplateSecret + from ..models.template_secret_group import TemplateSecretGroup + from ..models.template_setup import TemplateSetup + from ..models.template_source_type_0 import TemplateSourceType0 + from ..models.template_source_type_1 import TemplateSourceType1 + from ..models.template_variable import TemplateVariable + schema_version = self.schema_version + + id = self.id + + title = self.title + + summary = self.summary + + author = self.author.to_dict() + + tags = self.tags + + + + source: dict[str, Any] + if isinstance(self.source, TemplateSourceType0): + source = self.source.to_dict() + else: + source = self.source.to_dict() + + + install = self.install.to_dict() + + secrets = [] + for secrets_item_data in self.secrets: + secrets_item = secrets_item_data.to_dict() + secrets.append(secrets_item) + + + + secret_groups = [] + for secret_groups_item_data in self.secret_groups: + secret_groups_item = secret_groups_item_data.to_dict() + secret_groups.append(secret_groups_item) + + + + variables = [] + for variables_item_data in self.variables: + variables_item = variables_item_data.to_dict() + variables.append(variables_item) + + + + description = self.description + + setup: dict[str, Any] | Unset = UNSET + if not isinstance(self.setup, Unset): + setup = self.setup.to_dict() + + post_install = self.post_install + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "schemaVersion": schema_version, + "id": id, + "title": title, + "summary": summary, + "author": author, + "tags": tags, + "source": source, + "install": install, + "secrets": secrets, + "secretGroups": secret_groups, + "variables": variables, + }) + if description is not UNSET: + field_dict["description"] = description + if setup is not UNSET: + field_dict["setup"] = setup + if post_install is not UNSET: + field_dict["postInstall"] = post_install + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.template_author import TemplateAuthor + from ..models.template_install import TemplateInstall + from ..models.template_secret import TemplateSecret + from ..models.template_secret_group import TemplateSecretGroup + from ..models.template_setup import TemplateSetup + from ..models.template_source_type_0 import TemplateSourceType0 + from ..models.template_source_type_1 import TemplateSourceType1 + from ..models.template_variable import TemplateVariable + d = dict(src_dict) + schema_version = cast(Literal[1] , d.pop("schemaVersion")) + if schema_version != 1: + raise ValueError(f"schemaVersion must match const 1, got '{schema_version}'") + + id = d.pop("id") + + title = d.pop("title") + + summary = d.pop("summary") + + author = TemplateAuthor.from_dict(d.pop("author")) + + + + + tags = cast(list[str], d.pop("tags")) + + + def _parse_source(data: object) -> TemplateSourceType0 | TemplateSourceType1: + try: + if not isinstance(data, dict): + raise TypeError() + componentsschemas_template_source_type_0 = TemplateSourceType0.from_dict(data) + + + + return componentsschemas_template_source_type_0 + except (TypeError, ValueError, AttributeError, KeyError): + pass + if not isinstance(data, dict): + raise TypeError() + componentsschemas_template_source_type_1 = TemplateSourceType1.from_dict(data) + + + + return componentsschemas_template_source_type_1 + + source = _parse_source(d.pop("source")) + + + install = TemplateInstall.from_dict(d.pop("install")) + + + + + secrets = [] + _secrets = d.pop("secrets") + for secrets_item_data in (_secrets): + secrets_item = TemplateSecret.from_dict(secrets_item_data) + + + + secrets.append(secrets_item) + + + secret_groups = [] + _secret_groups = d.pop("secretGroups") + for secret_groups_item_data in (_secret_groups): + secret_groups_item = TemplateSecretGroup.from_dict(secret_groups_item_data) + + + + secret_groups.append(secret_groups_item) + + + variables = [] + _variables = d.pop("variables") + for variables_item_data in (_variables): + variables_item = TemplateVariable.from_dict(variables_item_data) + + + + variables.append(variables_item) + + + description = d.pop("description", UNSET) + + _setup = d.pop("setup", UNSET) + setup: TemplateSetup | Unset + if isinstance(_setup, Unset): + setup = UNSET + else: + setup = TemplateSetup.from_dict(_setup) + + + + + post_install = d.pop("postInstall", UNSET) + + template_manifest = cls( + schema_version=schema_version, + id=id, + title=title, + summary=summary, + author=author, + tags=tags, + source=source, + install=install, + secrets=secrets, + secret_groups=secret_groups, + variables=variables, + description=description, + setup=setup, + post_install=post_install, + ) + + return template_manifest + diff --git a/sdk-python/src/primitive/api/models/template_registry_detail.py b/sdk-python/src/primitive/api/models/template_registry_detail.py new file mode 100644 index 0000000..bd22294 --- /dev/null +++ b/sdk-python/src/primitive/api/models/template_registry_detail.py @@ -0,0 +1,258 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..models.template_registry_status import TemplateRegistryStatus +from dateutil.parser import isoparse +from typing import cast +from uuid import UUID +import datetime + +if TYPE_CHECKING: + from ..models.template_author import TemplateAuthor + from ..models.template_manifest import TemplateManifest + + + + + +T = TypeVar("T", bound="TemplateRegistryDetail") + + + +@_attrs_define +class TemplateRegistryDetail: + """ + Attributes: + id (UUID): + slug (str): Stable template slug used in template URLs and install commands. + title (str): + summary (str): + author (TemplateAuthor): + tags (list[str]): + verified (bool): + install_count (int): + github_repo (str): GitHub repository in owner/repo form. + created_at (datetime.datetime): + updated_at (datetime.datetime): + description (None | str): + github_sha (str): + github_path (None | str): + manifest (TemplateManifest): + readme (None | str): + status (TemplateRegistryStatus): + """ + + id: UUID + slug: str + title: str + summary: str + author: TemplateAuthor + tags: list[str] + verified: bool + install_count: int + github_repo: str + created_at: datetime.datetime + updated_at: datetime.datetime + description: None | str + github_sha: str + github_path: None | str + manifest: TemplateManifest + readme: None | str + status: TemplateRegistryStatus + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.template_author import TemplateAuthor + from ..models.template_manifest import TemplateManifest + id = str(self.id) + + slug = self.slug + + title = self.title + + summary = self.summary + + author = self.author.to_dict() + + tags = self.tags + + + + verified = self.verified + + install_count = self.install_count + + github_repo = self.github_repo + + created_at = self.created_at.isoformat() + + updated_at = self.updated_at.isoformat() + + description: None | str + description = self.description + + github_sha = self.github_sha + + github_path: None | str + github_path = self.github_path + + manifest = self.manifest.to_dict() + + readme: None | str + readme = self.readme + + status = self.status.value + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "id": id, + "slug": slug, + "title": title, + "summary": summary, + "author": author, + "tags": tags, + "verified": verified, + "install_count": install_count, + "github_repo": github_repo, + "created_at": created_at, + "updated_at": updated_at, + "description": description, + "github_sha": github_sha, + "github_path": github_path, + "manifest": manifest, + "readme": readme, + "status": status, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.template_author import TemplateAuthor + from ..models.template_manifest import TemplateManifest + d = dict(src_dict) + id = UUID(d.pop("id")) + + + + + slug = d.pop("slug") + + title = d.pop("title") + + summary = d.pop("summary") + + author = TemplateAuthor.from_dict(d.pop("author")) + + + + + tags = cast(list[str], d.pop("tags")) + + + verified = d.pop("verified") + + install_count = d.pop("install_count") + + github_repo = d.pop("github_repo") + + created_at = isoparse(d.pop("created_at")) + + + + + updated_at = isoparse(d.pop("updated_at")) + + + + + def _parse_description(data: object) -> None | str: + if data is None: + return data + return cast(None | str, data) + + description = _parse_description(d.pop("description")) + + + github_sha = d.pop("github_sha") + + def _parse_github_path(data: object) -> None | str: + if data is None: + return data + return cast(None | str, data) + + github_path = _parse_github_path(d.pop("github_path")) + + + manifest = TemplateManifest.from_dict(d.pop("manifest")) + + + + + def _parse_readme(data: object) -> None | str: + if data is None: + return data + return cast(None | str, data) + + readme = _parse_readme(d.pop("readme")) + + + status = TemplateRegistryStatus(d.pop("status")) + + + + + template_registry_detail = cls( + id=id, + slug=slug, + title=title, + summary=summary, + author=author, + tags=tags, + verified=verified, + install_count=install_count, + github_repo=github_repo, + created_at=created_at, + updated_at=updated_at, + description=description, + github_sha=github_sha, + github_path=github_path, + manifest=manifest, + readme=readme, + status=status, + ) + + + template_registry_detail.additional_properties = d + return template_registry_detail + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/sdk-python/src/primitive/api/models/template_registry_page.py b/sdk-python/src/primitive/api/models/template_registry_page.py new file mode 100644 index 0000000..d06c015 --- /dev/null +++ b/sdk-python/src/primitive/api/models/template_registry_page.py @@ -0,0 +1,110 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + +if TYPE_CHECKING: + from ..models.template_registry_summary import TemplateRegistrySummary + + + + + +T = TypeVar("T", bound="TemplateRegistryPage") + + + +@_attrs_define +class TemplateRegistryPage: + """ + Attributes: + items (list[TemplateRegistrySummary]): + next_cursor (None | str): Cursor to pass as the next `cursor` query value, or null when there are no more + templates. + """ + + items: list[TemplateRegistrySummary] + next_cursor: None | str + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.template_registry_summary import TemplateRegistrySummary + items = [] + for items_item_data in self.items: + items_item = items_item_data.to_dict() + items.append(items_item) + + + + next_cursor: None | str + next_cursor = self.next_cursor + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "items": items, + "next_cursor": next_cursor, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.template_registry_summary import TemplateRegistrySummary + d = dict(src_dict) + items = [] + _items = d.pop("items") + for items_item_data in (_items): + items_item = TemplateRegistrySummary.from_dict(items_item_data) + + + + items.append(items_item) + + + def _parse_next_cursor(data: object) -> None | str: + if data is None: + return data + return cast(None | str, data) + + next_cursor = _parse_next_cursor(d.pop("next_cursor")) + + + template_registry_page = cls( + items=items, + next_cursor=next_cursor, + ) + + + template_registry_page.additional_properties = d + return template_registry_page + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/sdk-python/src/primitive/api/models/template_registry_status.py b/sdk-python/src/primitive/api/models/template_registry_status.py new file mode 100644 index 0000000..d9f7ea0 --- /dev/null +++ b/sdk-python/src/primitive/api/models/template_registry_status.py @@ -0,0 +1,9 @@ +from enum import Enum + +class TemplateRegistryStatus(str, Enum): + APPROVED = "approved" + PENDING = "pending" + REJECTED = "rejected" + + def __str__(self) -> str: + return str(self.value) diff --git a/sdk-python/src/primitive/api/models/template_registry_summary.py b/sdk-python/src/primitive/api/models/template_registry_summary.py new file mode 100644 index 0000000..56224fe --- /dev/null +++ b/sdk-python/src/primitive/api/models/template_registry_summary.py @@ -0,0 +1,179 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from dateutil.parser import isoparse +from typing import cast +from uuid import UUID +import datetime + +if TYPE_CHECKING: + from ..models.template_author import TemplateAuthor + + + + + +T = TypeVar("T", bound="TemplateRegistrySummary") + + + +@_attrs_define +class TemplateRegistrySummary: + """ + Attributes: + id (UUID): + slug (str): Stable template slug used in template URLs and install commands. + title (str): + summary (str): + author (TemplateAuthor): + tags (list[str]): + verified (bool): + install_count (int): + github_repo (str): GitHub repository in owner/repo form. + created_at (datetime.datetime): + updated_at (datetime.datetime): + """ + + id: UUID + slug: str + title: str + summary: str + author: TemplateAuthor + tags: list[str] + verified: bool + install_count: int + github_repo: str + created_at: datetime.datetime + updated_at: datetime.datetime + additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict) + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.template_author import TemplateAuthor + id = str(self.id) + + slug = self.slug + + title = self.title + + summary = self.summary + + author = self.author.to_dict() + + tags = self.tags + + + + verified = self.verified + + install_count = self.install_count + + github_repo = self.github_repo + + created_at = self.created_at.isoformat() + + updated_at = self.updated_at.isoformat() + + + field_dict: dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({ + "id": id, + "slug": slug, + "title": title, + "summary": summary, + "author": author, + "tags": tags, + "verified": verified, + "install_count": install_count, + "github_repo": github_repo, + "created_at": created_at, + "updated_at": updated_at, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.template_author import TemplateAuthor + d = dict(src_dict) + id = UUID(d.pop("id")) + + + + + slug = d.pop("slug") + + title = d.pop("title") + + summary = d.pop("summary") + + author = TemplateAuthor.from_dict(d.pop("author")) + + + + + tags = cast(list[str], d.pop("tags")) + + + verified = d.pop("verified") + + install_count = d.pop("install_count") + + github_repo = d.pop("github_repo") + + created_at = isoparse(d.pop("created_at")) + + + + + updated_at = isoparse(d.pop("updated_at")) + + + + + template_registry_summary = cls( + id=id, + slug=slug, + title=title, + summary=summary, + author=author, + tags=tags, + verified=verified, + install_count=install_count, + github_repo=github_repo, + created_at=created_at, + updated_at=updated_at, + ) + + + template_registry_summary.additional_properties = d + return template_registry_summary + + @property + def additional_keys(self) -> list[str]: + return list(self.additional_properties.keys()) + + def __getitem__(self, key: str) -> Any: + return self.additional_properties[key] + + def __setitem__(self, key: str, value: Any) -> None: + self.additional_properties[key] = value + + def __delitem__(self, key: str) -> None: + del self.additional_properties[key] + + def __contains__(self, key: str) -> bool: + return key in self.additional_properties diff --git a/sdk-python/src/primitive/api/models/template_secret.py b/sdk-python/src/primitive/api/models/template_secret.py new file mode 100644 index 0000000..a9fb3fb --- /dev/null +++ b/sdk-python/src/primitive/api/models/template_secret.py @@ -0,0 +1,75 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + + + + + + + +T = TypeVar("T", bound="TemplateSecret") + + + +@_attrs_define +class TemplateSecret: + """ + Attributes: + key (str): + required (bool): Default: True. + description (str | Unset): + """ + + key: str + required: bool = True + description: str | Unset = UNSET + + + + + + def to_dict(self) -> dict[str, Any]: + key = self.key + + required = self.required + + description = self.description + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "key": key, + "required": required, + }) + if description is not UNSET: + field_dict["description"] = description + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + key = d.pop("key") + + required = d.pop("required") + + description = d.pop("description", UNSET) + + template_secret = cls( + key=key, + required=required, + description=description, + ) + + return template_secret + diff --git a/sdk-python/src/primitive/api/models/template_secret_group.py b/sdk-python/src/primitive/api/models/template_secret_group.py new file mode 100644 index 0000000..7e67be5 --- /dev/null +++ b/sdk-python/src/primitive/api/models/template_secret_group.py @@ -0,0 +1,79 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + + + + + + +T = TypeVar("T", bound="TemplateSecretGroup") + + + +@_attrs_define +class TemplateSecretGroup: + """ + Attributes: + keys (list[str]): + min_ (int): Default: 1. + description (str | Unset): + """ + + keys: list[str] + min_: int = 1 + description: str | Unset = UNSET + + + + + + def to_dict(self) -> dict[str, Any]: + keys = self.keys + + + + min_ = self.min_ + + description = self.description + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "keys": keys, + "min": min_, + }) + if description is not UNSET: + field_dict["description"] = description + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + keys = cast(list[str], d.pop("keys")) + + + min_ = d.pop("min") + + description = d.pop("description", UNSET) + + template_secret_group = cls( + keys=keys, + min_=min_, + description=description, + ) + + return template_secret_group + diff --git a/sdk-python/src/primitive/api/models/template_setup.py b/sdk-python/src/primitive/api/models/template_setup.py new file mode 100644 index 0000000..6e3c1ec --- /dev/null +++ b/sdk-python/src/primitive/api/models/template_setup.py @@ -0,0 +1,78 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import cast + + + + + + +T = TypeVar("T", bound="TemplateSetup") + + + +@_attrs_define +class TemplateSetup: + """ + Attributes: + agent (str): + prompt (str): + produces (list[str]): + """ + + agent: str + prompt: str + produces: list[str] + + + + + + def to_dict(self) -> dict[str, Any]: + agent = self.agent + + prompt = self.prompt + + produces = self.produces + + + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "agent": agent, + "prompt": prompt, + "produces": produces, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + agent = d.pop("agent") + + prompt = d.pop("prompt") + + produces = cast(list[str], d.pop("produces")) + + + template_setup = cls( + agent=agent, + prompt=prompt, + produces=produces, + ) + + return template_setup + diff --git a/sdk-python/src/primitive/api/models/template_source_type_0.py b/sdk-python/src/primitive/api/models/template_source_type_0.py new file mode 100644 index 0000000..4c964f0 --- /dev/null +++ b/sdk-python/src/primitive/api/models/template_source_type_0.py @@ -0,0 +1,69 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import Literal, cast + + + + + + +T = TypeVar("T", bound="TemplateSourceType0") + + + +@_attrs_define +class TemplateSourceType0: + """ + Attributes: + mode (Literal['managed-build']): + dir_ (str): Default: '.'. + """ + + mode: Literal['managed-build'] + dir_: str = '.' + + + + + + def to_dict(self) -> dict[str, Any]: + mode = self.mode + + dir_ = self.dir_ + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "mode": mode, + "dir": dir_, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + mode = cast(Literal['managed-build'] , d.pop("mode")) + if mode != 'managed-build': + raise ValueError(f"mode must match const 'managed-build', got '{mode}'") + + dir_ = d.pop("dir") + + template_source_type_0 = cls( + mode=mode, + dir_=dir_, + ) + + return template_source_type_0 + diff --git a/sdk-python/src/primitive/api/models/template_source_type_1.py b/sdk-python/src/primitive/api/models/template_source_type_1.py new file mode 100644 index 0000000..a3cc564 --- /dev/null +++ b/sdk-python/src/primitive/api/models/template_source_type_1.py @@ -0,0 +1,69 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from typing import Literal, cast + + + + + + +T = TypeVar("T", bound="TemplateSourceType1") + + + +@_attrs_define +class TemplateSourceType1: + """ + Attributes: + mode (Literal['bundle']): + file (str): + """ + + mode: Literal['bundle'] + file: str + + + + + + def to_dict(self) -> dict[str, Any]: + mode = self.mode + + file = self.file + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "mode": mode, + "file": file, + }) + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + mode = cast(Literal['bundle'] , d.pop("mode")) + if mode != 'bundle': + raise ValueError(f"mode must match const 'bundle', got '{mode}'") + + file = d.pop("file") + + template_source_type_1 = cls( + mode=mode, + file=file, + ) + + return template_source_type_1 + diff --git a/sdk-python/src/primitive/api/models/template_variable.py b/sdk-python/src/primitive/api/models/template_variable.py new file mode 100644 index 0000000..cad59a6 --- /dev/null +++ b/sdk-python/src/primitive/api/models/template_variable.py @@ -0,0 +1,134 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + +from ..models.template_variable_type import TemplateVariableType +from typing import cast + +if TYPE_CHECKING: + from ..models.template_variable_validation import TemplateVariableValidation + + + + + +T = TypeVar("T", bound="TemplateVariable") + + + +@_attrs_define +class TemplateVariable: + """ + Attributes: + key (str): + prompt (str): + type_ (TemplateVariableType): Default: TemplateVariableType.STRING. + default (str | Unset): + file (str | Unset): + options (list[str] | Unset): + validation (TemplateVariableValidation | Unset): + """ + + key: str + prompt: str + type_: TemplateVariableType = TemplateVariableType.STRING + default: str | Unset = UNSET + file: str | Unset = UNSET + options: list[str] | Unset = UNSET + validation: TemplateVariableValidation | Unset = UNSET + + + + + + def to_dict(self) -> dict[str, Any]: + from ..models.template_variable_validation import TemplateVariableValidation + key = self.key + + prompt = self.prompt + + type_ = self.type_.value + + default = self.default + + file = self.file + + options: list[str] | Unset = UNSET + if not isinstance(self.options, Unset): + options = self.options + + + + validation: dict[str, Any] | Unset = UNSET + if not isinstance(self.validation, Unset): + validation = self.validation.to_dict() + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + "key": key, + "prompt": prompt, + "type": type_, + }) + if default is not UNSET: + field_dict["default"] = default + if file is not UNSET: + field_dict["file"] = file + if options is not UNSET: + field_dict["options"] = options + if validation is not UNSET: + field_dict["validation"] = validation + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + from ..models.template_variable_validation import TemplateVariableValidation + d = dict(src_dict) + key = d.pop("key") + + prompt = d.pop("prompt") + + type_ = TemplateVariableType(d.pop("type")) + + + + + default = d.pop("default", UNSET) + + file = d.pop("file", UNSET) + + options = cast(list[str], d.pop("options", UNSET)) + + + _validation = d.pop("validation", UNSET) + validation: TemplateVariableValidation | Unset + if isinstance(_validation, Unset): + validation = UNSET + else: + validation = TemplateVariableValidation.from_dict(_validation) + + + + + template_variable = cls( + key=key, + prompt=prompt, + type_=type_, + default=default, + file=file, + options=options, + validation=validation, + ) + + return template_variable + diff --git a/sdk-python/src/primitive/api/models/template_variable_type.py b/sdk-python/src/primitive/api/models/template_variable_type.py new file mode 100644 index 0000000..11814dc --- /dev/null +++ b/sdk-python/src/primitive/api/models/template_variable_type.py @@ -0,0 +1,10 @@ +from enum import Enum + +class TemplateVariableType(str, Enum): + EMAIL = "email" + SELECT = "select" + STRING = "string" + URL = "url" + + def __str__(self) -> str: + return str(self.value) diff --git a/sdk-python/src/primitive/api/models/template_variable_validation.py b/sdk-python/src/primitive/api/models/template_variable_validation.py new file mode 100644 index 0000000..23a87ed --- /dev/null +++ b/sdk-python/src/primitive/api/models/template_variable_validation.py @@ -0,0 +1,68 @@ +from __future__ import annotations + +from collections.abc import Mapping +from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator + +from attrs import define as _attrs_define +from attrs import field as _attrs_field + +from ..types import UNSET, Unset + + + + + + + +T = TypeVar("T", bound="TemplateVariableValidation") + + + +@_attrs_define +class TemplateVariableValidation: + """ + Attributes: + pattern (str | Unset): + max_length (int | Unset): + """ + + pattern: str | Unset = UNSET + max_length: int | Unset = UNSET + + + + + + def to_dict(self) -> dict[str, Any]: + pattern = self.pattern + + max_length = self.max_length + + + field_dict: dict[str, Any] = {} + + field_dict.update({ + }) + if pattern is not UNSET: + field_dict["pattern"] = pattern + if max_length is not UNSET: + field_dict["maxLength"] = max_length + + return field_dict + + + + @classmethod + def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T: + d = dict(src_dict) + pattern = d.pop("pattern", UNSET) + + max_length = d.pop("maxLength", UNSET) + + template_variable_validation = cls( + pattern=pattern, + max_length=max_length, + ) + + return template_variable_validation +