// Package client provides primitives to interact with the openapi HTTP API.
//
// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.4.1 DO NOT EDIT.
package client

import (
	"bytes"
	"context"
	"encoding/json"
	"errors"
	"fmt"
	"io"
	"net/http"
	"net/url"
	"strings"

	"github.com/oapi-codegen/runtime"
)

// Defines values for MessageInfoRole.
const (
	Assistant MessageInfoRole = "assistant"
	System    MessageInfoRole = "system"
	User      MessageInfoRole = "user"
)

// Event defines model for Event.
type Event struct {
	union json.RawMessage
}

// EventLspClientDiagnostics defines model for Event.lsp.client.diagnostics.
type EventLspClientDiagnostics struct {
	Properties struct {
		Path     string `json:"path"`
		ServerID string `json:"serverID"`
	} `json:"properties"`
	Type string `json:"type"`
}

// EventMessageUpdated defines model for Event.message.updated.
type EventMessageUpdated struct {
	Properties struct {
		Info MessageInfo `json:"info"`
	} `json:"properties"`
	Type string `json:"type"`
}

// EventSessionUpdated defines model for Event.session.updated.
type EventSessionUpdated struct {
	Properties struct {
		Info SessionInfo `json:"info"`
	} `json:"properties"`
	Type string `json:"type"`
}

// EventStorageWrite defines model for Event.storage.write.
type EventStorageWrite struct {
	Properties struct {
		Content *interface{} `json:"content,omitempty"`
		Key     string       `json:"key"`
	} `json:"properties"`
	Type string `json:"type"`
}

// MessageInfo defines model for Message.Info.
type MessageInfo struct {
	Id       string `json:"id"`
	Metadata struct {
		Assistant *struct {
			Cost       float32 `json:"cost"`
			ModelID    string  `json:"modelID"`
			ProviderID string  `json:"providerID"`
			Tokens     struct {
				Input     float32 `json:"input"`
				Output    float32 `json:"output"`
				Reasoning float32 `json:"reasoning"`
			} `json:"tokens"`
		} `json:"assistant,omitempty"`
		SessionID string `json:"sessionID"`
		Time      struct {
			Completed *float32 `json:"completed,omitempty"`
			Created   float32  `json:"created"`
		} `json:"time"`
		Tool map[string]interface{} `json:"tool"`
	} `json:"metadata"`
	Parts []MessagePart   `json:"parts"`
	Role  MessageInfoRole `json:"role"`
}

// MessageInfoRole defines model for MessageInfo.Role.
type MessageInfoRole string

// MessagePart defines model for Message.Part.
type MessagePart struct {
	union json.RawMessage
}

// MessagePartFile defines model for Message.Part.File.
type MessagePartFile struct {
	Filename  *string `json:"filename,omitempty"`
	MediaType string  `json:"mediaType"`
	Type      string  `json:"type"`
	Url       string  `json:"url"`
}

// MessagePartReasoning defines model for Message.Part.Reasoning.
type MessagePartReasoning struct {
	ProviderMetadata *map[string]interface{} `json:"providerMetadata,omitempty"`
	Text             string                  `json:"text"`
	Type             string                  `json:"type"`
}

// MessagePartSourceUrl defines model for Message.Part.SourceUrl.
type MessagePartSourceUrl struct {
	ProviderMetadata *map[string]interface{} `json:"providerMetadata,omitempty"`
	SourceId         string                  `json:"sourceId"`
	Title            *string                 `json:"title,omitempty"`
	Type             string                  `json:"type"`
	Url              string                  `json:"url"`
}

// MessagePartStepStart defines model for Message.Part.StepStart.
type MessagePartStepStart struct {
	Type string `json:"type"`
}

// MessagePartText defines model for Message.Part.Text.
type MessagePartText struct {
	Text string `json:"text"`
	Type string `json:"type"`
}

// MessagePartToolInvocation defines model for Message.Part.ToolInvocation.
type MessagePartToolInvocation struct {
	ToolInvocation MessageToolInvocation `json:"toolInvocation"`
	Type           string                `json:"type"`
}

// MessageToolInvocation defines model for Message.ToolInvocation.
type MessageToolInvocation struct {
	union json.RawMessage
}

// MessageToolInvocationToolCall defines model for Message.ToolInvocation.ToolCall.
type MessageToolInvocationToolCall struct {
	Args       *interface{} `json:"args,omitempty"`
	State      string       `json:"state"`
	Step       *float32     `json:"step,omitempty"`
	ToolCallId string       `json:"toolCallId"`
	ToolName   string       `json:"toolName"`
}

// MessageToolInvocationToolPartialCall defines model for Message.ToolInvocation.ToolPartialCall.
type MessageToolInvocationToolPartialCall struct {
	Args       *interface{} `json:"args,omitempty"`
	State      string       `json:"state"`
	Step       *float32     `json:"step,omitempty"`
	ToolCallId string       `json:"toolCallId"`
	ToolName   string       `json:"toolName"`
}

// MessageToolInvocationToolResult defines model for Message.ToolInvocation.ToolResult.
type MessageToolInvocationToolResult struct {
	Args       *interface{} `json:"args,omitempty"`
	Result     string       `json:"result"`
	State      string       `json:"state"`
	Step       *float32     `json:"step,omitempty"`
	ToolCallId string       `json:"toolCallId"`
	ToolName   string       `json:"toolName"`
}

// ProviderInfo defines model for Provider.Info.
type ProviderInfo struct {
	Models  map[string]ProviderModel `json:"models"`
	Options *map[string]interface{}  `json:"options,omitempty"`
}

// ProviderModel defines model for Provider.Model.
type ProviderModel struct {
	Attachment    bool    `json:"attachment"`
	ContextWindow float32 `json:"contextWindow"`
	Cost          struct {
		Input        float32 `json:"input"`
		InputCached  float32 `json:"inputCached"`
		Output       float32 `json:"output"`
		OutputCached float32 `json:"outputCached"`
	} `json:"cost"`
	MaxTokens *float32 `json:"maxTokens,omitempty"`
	Name      *string  `json:"name,omitempty"`
	Reasoning *bool    `json:"reasoning,omitempty"`
}

// SessionInfo defines model for session.info.
type SessionInfo struct {
	Id      string  `json:"id"`
	ShareID *string `json:"shareID,omitempty"`
	Title   string  `json:"title"`
}

// PostSessionAbortJSONBody defines parameters for PostSessionAbort.
type PostSessionAbortJSONBody struct {
	SessionID string `json:"sessionID"`
}

// PostSessionChatJSONBody defines parameters for PostSessionChat.
type PostSessionChatJSONBody struct {
	ModelID    string        `json:"modelID"`
	Parts      []MessagePart `json:"parts"`
	ProviderID string        `json:"providerID"`
	SessionID  string        `json:"sessionID"`
}

// PostSessionMessagesJSONBody defines parameters for PostSessionMessages.
type PostSessionMessagesJSONBody struct {
	SessionID string `json:"sessionID"`
}

// PostSessionShareJSONBody defines parameters for PostSessionShare.
type PostSessionShareJSONBody struct {
	SessionID string `json:"sessionID"`
}

// PostSessionAbortJSONRequestBody defines body for PostSessionAbort for application/json ContentType.
type PostSessionAbortJSONRequestBody PostSessionAbortJSONBody

// PostSessionChatJSONRequestBody defines body for PostSessionChat for application/json ContentType.
type PostSessionChatJSONRequestBody PostSessionChatJSONBody

// PostSessionMessagesJSONRequestBody defines body for PostSessionMessages for application/json ContentType.
type PostSessionMessagesJSONRequestBody PostSessionMessagesJSONBody

// PostSessionShareJSONRequestBody defines body for PostSessionShare for application/json ContentType.
type PostSessionShareJSONRequestBody PostSessionShareJSONBody

// AsEventStorageWrite returns the union data inside the Event as a EventStorageWrite
func (t Event) AsEventStorageWrite() (EventStorageWrite, error) {
	var body EventStorageWrite
	err := json.Unmarshal(t.union, &body)
	return body, err
}

// FromEventStorageWrite overwrites any union data inside the Event as the provided EventStorageWrite
func (t *Event) FromEventStorageWrite(v EventStorageWrite) error {
	v.Type = "storage.write"
	b, err := json.Marshal(v)
	t.union = b
	return err
}

// MergeEventStorageWrite performs a merge with any union data inside the Event, using the provided EventStorageWrite
func (t *Event) MergeEventStorageWrite(v EventStorageWrite) error {
	v.Type = "storage.write"
	b, err := json.Marshal(v)
	if err != nil {
		return err
	}

	merged, err := runtime.JSONMerge(t.union, b)
	t.union = merged
	return err
}

// AsEventLspClientDiagnostics returns the union data inside the Event as a EventLspClientDiagnostics
func (t Event) AsEventLspClientDiagnostics() (EventLspClientDiagnostics, error) {
	var body EventLspClientDiagnostics
	err := json.Unmarshal(t.union, &body)
	return body, err
}

// FromEventLspClientDiagnostics overwrites any union data inside the Event as the provided EventLspClientDiagnostics
func (t *Event) FromEventLspClientDiagnostics(v EventLspClientDiagnostics) error {
	v.Type = "lsp.client.diagnostics"
	b, err := json.Marshal(v)
	t.union = b
	return err
}

// MergeEventLspClientDiagnostics performs a merge with any union data inside the Event, using the provided EventLspClientDiagnostics
func (t *Event) MergeEventLspClientDiagnostics(v EventLspClientDiagnostics) error {
	v.Type = "lsp.client.diagnostics"
	b, err := json.Marshal(v)
	if err != nil {
		return err
	}

	merged, err := runtime.JSONMerge(t.union, b)
	t.union = merged
	return err
}

// AsEventMessageUpdated returns the union data inside the Event as a EventMessageUpdated
func (t Event) AsEventMessageUpdated() (EventMessageUpdated, error) {
	var body EventMessageUpdated
	err := json.Unmarshal(t.union, &body)
	return body, err
}

// FromEventMessageUpdated overwrites any union data inside the Event as the provided EventMessageUpdated
func (t *Event) FromEventMessageUpdated(v EventMessageUpdated) error {
	v.Type = "message.updated"
	b, err := json.Marshal(v)
	t.union = b
	return err
}

// MergeEventMessageUpdated performs a merge with any union data inside the Event, using the provided EventMessageUpdated
func (t *Event) MergeEventMessageUpdated(v EventMessageUpdated) error {
	v.Type = "message.updated"
	b, err := json.Marshal(v)
	if err != nil {
		return err
	}

	merged, err := runtime.JSONMerge(t.union, b)
	t.union = merged
	return err
}

// AsEventSessionUpdated returns the union data inside the Event as a EventSessionUpdated
func (t Event) AsEventSessionUpdated() (EventSessionUpdated, error) {
	var body EventSessionUpdated
	err := json.Unmarshal(t.union, &body)
	return body, err
}

// FromEventSessionUpdated overwrites any union data inside the Event as the provided EventSessionUpdated
func (t *Event) FromEventSessionUpdated(v EventSessionUpdated) error {
	v.Type = "session.updated"
	b, err := json.Marshal(v)
	t.union = b
	return err
}

// MergeEventSessionUpdated performs a merge with any union data inside the Event, using the provided EventSessionUpdated
func (t *Event) MergeEventSessionUpdated(v EventSessionUpdated) error {
	v.Type = "session.updated"
	b, err := json.Marshal(v)
	if err != nil {
		return err
	}

	merged, err := runtime.JSONMerge(t.union, b)
	t.union = merged
	return err
}

func (t Event) Discriminator() (string, error) {
	var discriminator struct {
		Discriminator string `json:"type"`
	}
	err := json.Unmarshal(t.union, &discriminator)
	return discriminator.Discriminator, err
}

func (t Event) ValueByDiscriminator() (interface{}, error) {
	discriminator, err := t.Discriminator()
	if err != nil {
		return nil, err
	}
	switch discriminator {
	case "lsp.client.diagnostics":
		return t.AsEventLspClientDiagnostics()
	case "message.updated":
		return t.AsEventMessageUpdated()
	case "session.updated":
		return t.AsEventSessionUpdated()
	case "storage.write":
		return t.AsEventStorageWrite()
	default:
		return nil, errors.New("unknown discriminator value: " + discriminator)
	}
}

func (t Event) MarshalJSON() ([]byte, error) {
	b, err := t.union.MarshalJSON()
	return b, err
}

func (t *Event) UnmarshalJSON(b []byte) error {
	err := t.union.UnmarshalJSON(b)
	return err
}

// AsMessagePartText returns the union data inside the MessagePart as a MessagePartText
func (t MessagePart) AsMessagePartText() (MessagePartText, error) {
	var body MessagePartText
	err := json.Unmarshal(t.union, &body)
	return body, err
}

// FromMessagePartText overwrites any union data inside the MessagePart as the provided MessagePartText
func (t *MessagePart) FromMessagePartText(v MessagePartText) error {
	v.Type = "text"
	b, err := json.Marshal(v)
	t.union = b
	return err
}

// MergeMessagePartText performs a merge with any union data inside the MessagePart, using the provided MessagePartText
func (t *MessagePart) MergeMessagePartText(v MessagePartText) error {
	v.Type = "text"
	b, err := json.Marshal(v)
	if err != nil {
		return err
	}

	merged, err := runtime.JSONMerge(t.union, b)
	t.union = merged
	return err
}

// AsMessagePartReasoning returns the union data inside the MessagePart as a MessagePartReasoning
func (t MessagePart) AsMessagePartReasoning() (MessagePartReasoning, error) {
	var body MessagePartReasoning
	err := json.Unmarshal(t.union, &body)
	return body, err
}

// FromMessagePartReasoning overwrites any union data inside the MessagePart as the provided MessagePartReasoning
func (t *MessagePart) FromMessagePartReasoning(v MessagePartReasoning) error {
	v.Type = "reasoning"
	b, err := json.Marshal(v)
	t.union = b
	return err
}

// MergeMessagePartReasoning performs a merge with any union data inside the MessagePart, using the provided MessagePartReasoning
func (t *MessagePart) MergeMessagePartReasoning(v MessagePartReasoning) error {
	v.Type = "reasoning"
	b, err := json.Marshal(v)
	if err != nil {
		return err
	}

	merged, err := runtime.JSONMerge(t.union, b)
	t.union = merged
	return err
}

// AsMessagePartToolInvocation returns the union data inside the MessagePart as a MessagePartToolInvocation
func (t MessagePart) AsMessagePartToolInvocation() (MessagePartToolInvocation, error) {
	var body MessagePartToolInvocation
	err := json.Unmarshal(t.union, &body)
	return body, err
}

// FromMessagePartToolInvocation overwrites any union data inside the MessagePart as the provided MessagePartToolInvocation
func (t *MessagePart) FromMessagePartToolInvocation(v MessagePartToolInvocation) error {
	v.Type = "tool-invocation"
	b, err := json.Marshal(v)
	t.union = b
	return err
}

// MergeMessagePartToolInvocation performs a merge with any union data inside the MessagePart, using the provided MessagePartToolInvocation
func (t *MessagePart) MergeMessagePartToolInvocation(v MessagePartToolInvocation) error {
	v.Type = "tool-invocation"
	b, err := json.Marshal(v)
	if err != nil {
		return err
	}

	merged, err := runtime.JSONMerge(t.union, b)
	t.union = merged
	return err
}

// AsMessagePartSourceUrl returns the union data inside the MessagePart as a MessagePartSourceUrl
func (t MessagePart) AsMessagePartSourceUrl() (MessagePartSourceUrl, error) {
	var body MessagePartSourceUrl
	err := json.Unmarshal(t.union, &body)
	return body, err
}

// FromMessagePartSourceUrl overwrites any union data inside the MessagePart as the provided MessagePartSourceUrl
func (t *MessagePart) FromMessagePartSourceUrl(v MessagePartSourceUrl) error {
	v.Type = "source-url"
	b, err := json.Marshal(v)
	t.union = b
	return err
}

// MergeMessagePartSourceUrl performs a merge with any union data inside the MessagePart, using the provided MessagePartSourceUrl
func (t *MessagePart) MergeMessagePartSourceUrl(v MessagePartSourceUrl) error {
	v.Type = "source-url"
	b, err := json.Marshal(v)
	if err != nil {
		return err
	}

	merged, err := runtime.JSONMerge(t.union, b)
	t.union = merged
	return err
}

// AsMessagePartFile returns the union data inside the MessagePart as a MessagePartFile
func (t MessagePart) AsMessagePartFile() (MessagePartFile, error) {
	var body MessagePartFile
	err := json.Unmarshal(t.union, &body)
	return body, err
}

// FromMessagePartFile overwrites any union data inside the MessagePart as the provided MessagePartFile
func (t *MessagePart) FromMessagePartFile(v MessagePartFile) error {
	v.Type = "file"
	b, err := json.Marshal(v)
	t.union = b
	return err
}

// MergeMessagePartFile performs a merge with any union data inside the MessagePart, using the provided MessagePartFile
func (t *MessagePart) MergeMessagePartFile(v MessagePartFile) error {
	v.Type = "file"
	b, err := json.Marshal(v)
	if err != nil {
		return err
	}

	merged, err := runtime.JSONMerge(t.union, b)
	t.union = merged
	return err
}

// AsMessagePartStepStart returns the union data inside the MessagePart as a MessagePartStepStart
func (t MessagePart) AsMessagePartStepStart() (MessagePartStepStart, error) {
	var body MessagePartStepStart
	err := json.Unmarshal(t.union, &body)
	return body, err
}

// FromMessagePartStepStart overwrites any union data inside the MessagePart as the provided MessagePartStepStart
func (t *MessagePart) FromMessagePartStepStart(v MessagePartStepStart) error {
	v.Type = "step-start"
	b, err := json.Marshal(v)
	t.union = b
	return err
}

// MergeMessagePartStepStart performs a merge with any union data inside the MessagePart, using the provided MessagePartStepStart
func (t *MessagePart) MergeMessagePartStepStart(v MessagePartStepStart) error {
	v.Type = "step-start"
	b, err := json.Marshal(v)
	if err != nil {
		return err
	}

	merged, err := runtime.JSONMerge(t.union, b)
	t.union = merged
	return err
}

func (t MessagePart) Discriminator() (string, error) {
	var discriminator struct {
		Discriminator string `json:"type"`
	}
	err := json.Unmarshal(t.union, &discriminator)
	return discriminator.Discriminator, err
}

func (t MessagePart) ValueByDiscriminator() (interface{}, error) {
	discriminator, err := t.Discriminator()
	if err != nil {
		return nil, err
	}
	switch discriminator {
	case "file":
		return t.AsMessagePartFile()
	case "reasoning":
		return t.AsMessagePartReasoning()
	case "source-url":
		return t.AsMessagePartSourceUrl()
	case "step-start":
		return t.AsMessagePartStepStart()
	case "text":
		return t.AsMessagePartText()
	case "tool-invocation":
		return t.AsMessagePartToolInvocation()
	default:
		return nil, errors.New("unknown discriminator value: " + discriminator)
	}
}

func (t MessagePart) MarshalJSON() ([]byte, error) {
	b, err := t.union.MarshalJSON()
	return b, err
}

func (t *MessagePart) UnmarshalJSON(b []byte) error {
	err := t.union.UnmarshalJSON(b)
	return err
}

// AsMessageToolInvocationToolCall returns the union data inside the MessageToolInvocation as a MessageToolInvocationToolCall
func (t MessageToolInvocation) AsMessageToolInvocationToolCall() (MessageToolInvocationToolCall, error) {
	var body MessageToolInvocationToolCall
	err := json.Unmarshal(t.union, &body)
	return body, err
}

// FromMessageToolInvocationToolCall overwrites any union data inside the MessageToolInvocation as the provided MessageToolInvocationToolCall
func (t *MessageToolInvocation) FromMessageToolInvocationToolCall(v MessageToolInvocationToolCall) error {
	v.State = "call"
	b, err := json.Marshal(v)
	t.union = b
	return err
}

// MergeMessageToolInvocationToolCall performs a merge with any union data inside the MessageToolInvocation, using the provided MessageToolInvocationToolCall
func (t *MessageToolInvocation) MergeMessageToolInvocationToolCall(v MessageToolInvocationToolCall) error {
	v.State = "call"
	b, err := json.Marshal(v)
	if err != nil {
		return err
	}

	merged, err := runtime.JSONMerge(t.union, b)
	t.union = merged
	return err
}

// AsMessageToolInvocationToolPartialCall returns the union data inside the MessageToolInvocation as a MessageToolInvocationToolPartialCall
func (t MessageToolInvocation) AsMessageToolInvocationToolPartialCall() (MessageToolInvocationToolPartialCall, error) {
	var body MessageToolInvocationToolPartialCall
	err := json.Unmarshal(t.union, &body)
	return body, err
}

// FromMessageToolInvocationToolPartialCall overwrites any union data inside the MessageToolInvocation as the provided MessageToolInvocationToolPartialCall
func (t *MessageToolInvocation) FromMessageToolInvocationToolPartialCall(v MessageToolInvocationToolPartialCall) error {
	v.State = "partial-call"
	b, err := json.Marshal(v)
	t.union = b
	return err
}

// MergeMessageToolInvocationToolPartialCall performs a merge with any union data inside the MessageToolInvocation, using the provided MessageToolInvocationToolPartialCall
func (t *MessageToolInvocation) MergeMessageToolInvocationToolPartialCall(v MessageToolInvocationToolPartialCall) error {
	v.State = "partial-call"
	b, err := json.Marshal(v)
	if err != nil {
		return err
	}

	merged, err := runtime.JSONMerge(t.union, b)
	t.union = merged
	return err
}

// AsMessageToolInvocationToolResult returns the union data inside the MessageToolInvocation as a MessageToolInvocationToolResult
func (t MessageToolInvocation) AsMessageToolInvocationToolResult() (MessageToolInvocationToolResult, error) {
	var body MessageToolInvocationToolResult
	err := json.Unmarshal(t.union, &body)
	return body, err
}

// FromMessageToolInvocationToolResult overwrites any union data inside the MessageToolInvocation as the provided MessageToolInvocationToolResult
func (t *MessageToolInvocation) FromMessageToolInvocationToolResult(v MessageToolInvocationToolResult) error {
	v.State = "result"
	b, err := json.Marshal(v)
	t.union = b
	return err
}

// MergeMessageToolInvocationToolResult performs a merge with any union data inside the MessageToolInvocation, using the provided MessageToolInvocationToolResult
func (t *MessageToolInvocation) MergeMessageToolInvocationToolResult(v MessageToolInvocationToolResult) error {
	v.State = "result"
	b, err := json.Marshal(v)
	if err != nil {
		return err
	}

	merged, err := runtime.JSONMerge(t.union, b)
	t.union = merged
	return err
}

func (t MessageToolInvocation) Discriminator() (string, error) {
	var discriminator struct {
		Discriminator string `json:"state"`
	}
	err := json.Unmarshal(t.union, &discriminator)
	return discriminator.Discriminator, err
}

func (t MessageToolInvocation) ValueByDiscriminator() (interface{}, error) {
	discriminator, err := t.Discriminator()
	if err != nil {
		return nil, err
	}
	switch discriminator {
	case "call":
		return t.AsMessageToolInvocationToolCall()
	case "partial-call":
		return t.AsMessageToolInvocationToolPartialCall()
	case "result":
		return t.AsMessageToolInvocationToolResult()
	default:
		return nil, errors.New("unknown discriminator value: " + discriminator)
	}
}

func (t MessageToolInvocation) MarshalJSON() ([]byte, error) {
	b, err := t.union.MarshalJSON()
	return b, err
}

func (t *MessageToolInvocation) UnmarshalJSON(b []byte) error {
	err := t.union.UnmarshalJSON(b)
	return err
}

// RequestEditorFn  is the function signature for the RequestEditor callback function
type RequestEditorFn func(ctx context.Context, req *http.Request) error

// Doer performs HTTP requests.
//
// The standard http.Client implements this interface.
type HttpRequestDoer interface {
	Do(req *http.Request) (*http.Response, error)
}

// Client which conforms to the OpenAPI3 specification for this service.
type Client struct {
	// The endpoint of the server conforming to this interface, with scheme,
	// https://api.deepmap.com for example. This can contain a path relative
	// to the server, such as https://api.deepmap.com/dev-test, and all the
	// paths in the swagger spec will be appended to the server.
	Server string

	// Doer for performing requests, typically a *http.Client with any
	// customized settings, such as certificate chains.
	Client HttpRequestDoer

	// A list of callbacks for modifying requests which are generated before sending over
	// the network.
	RequestEditors []RequestEditorFn
}

// ClientOption allows setting custom parameters during construction
type ClientOption func(*Client) error

// Creates a new Client, with reasonable defaults
func NewClient(server string, opts ...ClientOption) (*Client, error) {
	// create a client with sane default values
	client := Client{
		Server: server,
	}
	// mutate client and add all optional params
	for _, o := range opts {
		if err := o(&client); err != nil {
			return nil, err
		}
	}
	// ensure the server URL always has a trailing slash
	if !strings.HasSuffix(client.Server, "/") {
		client.Server += "/"
	}
	// create httpClient, if not already present
	if client.Client == nil {
		client.Client = &http.Client{}
	}
	return &client, nil
}

// WithHTTPClient allows overriding the default Doer, which is
// automatically created using http.Client. This is useful for tests.
func WithHTTPClient(doer HttpRequestDoer) ClientOption {
	return func(c *Client) error {
		c.Client = doer
		return nil
	}
}

// WithRequestEditorFn allows setting up a callback function, which will be
// called right before sending the request. This can be used to mutate the request.
func WithRequestEditorFn(fn RequestEditorFn) ClientOption {
	return func(c *Client) error {
		c.RequestEditors = append(c.RequestEditors, fn)
		return nil
	}
}

// The interface specification for the client above.
type ClientInterface interface {
	// GetEvent request
	GetEvent(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error)

	// PostProviderList request
	PostProviderList(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error)

	// PostSessionAbortWithBody request with any body
	PostSessionAbortWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error)

	PostSessionAbort(ctx context.Context, body PostSessionAbortJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error)

	// PostSessionChatWithBody request with any body
	PostSessionChatWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error)

	PostSessionChat(ctx context.Context, body PostSessionChatJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error)

	// PostSessionCreate request
	PostSessionCreate(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error)

	// PostSessionList request
	PostSessionList(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error)

	// PostSessionMessagesWithBody request with any body
	PostSessionMessagesWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error)

	PostSessionMessages(ctx context.Context, body PostSessionMessagesJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error)

	// PostSessionShareWithBody request with any body
	PostSessionShareWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error)

	PostSessionShare(ctx context.Context, body PostSessionShareJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error)
}

func (c *Client) GetEvent(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) {
	req, err := NewGetEventRequest(c.Server)
	if err != nil {
		return nil, err
	}
	req = req.WithContext(ctx)
	if err := c.applyEditors(ctx, req, reqEditors); err != nil {
		return nil, err
	}
	return c.Client.Do(req)
}

func (c *Client) PostProviderList(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) {
	req, err := NewPostProviderListRequest(c.Server)
	if err != nil {
		return nil, err
	}
	req = req.WithContext(ctx)
	if err := c.applyEditors(ctx, req, reqEditors); err != nil {
		return nil, err
	}
	return c.Client.Do(req)
}

func (c *Client) PostSessionAbortWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) {
	req, err := NewPostSessionAbortRequestWithBody(c.Server, contentType, body)
	if err != nil {
		return nil, err
	}
	req = req.WithContext(ctx)
	if err := c.applyEditors(ctx, req, reqEditors); err != nil {
		return nil, err
	}
	return c.Client.Do(req)
}

func (c *Client) PostSessionAbort(ctx context.Context, body PostSessionAbortJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) {
	req, err := NewPostSessionAbortRequest(c.Server, body)
	if err != nil {
		return nil, err
	}
	req = req.WithContext(ctx)
	if err := c.applyEditors(ctx, req, reqEditors); err != nil {
		return nil, err
	}
	return c.Client.Do(req)
}

func (c *Client) PostSessionChatWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) {
	req, err := NewPostSessionChatRequestWithBody(c.Server, contentType, body)
	if err != nil {
		return nil, err
	}
	req = req.WithContext(ctx)
	if err := c.applyEditors(ctx, req, reqEditors); err != nil {
		return nil, err
	}
	return c.Client.Do(req)
}

func (c *Client) PostSessionChat(ctx context.Context, body PostSessionChatJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) {
	req, err := NewPostSessionChatRequest(c.Server, body)
	if err != nil {
		return nil, err
	}
	req = req.WithContext(ctx)
	if err := c.applyEditors(ctx, req, reqEditors); err != nil {
		return nil, err
	}
	return c.Client.Do(req)
}

func (c *Client) PostSessionCreate(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) {
	req, err := NewPostSessionCreateRequest(c.Server)
	if err != nil {
		return nil, err
	}
	req = req.WithContext(ctx)
	if err := c.applyEditors(ctx, req, reqEditors); err != nil {
		return nil, err
	}
	return c.Client.Do(req)
}

func (c *Client) PostSessionList(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) {
	req, err := NewPostSessionListRequest(c.Server)
	if err != nil {
		return nil, err
	}
	req = req.WithContext(ctx)
	if err := c.applyEditors(ctx, req, reqEditors); err != nil {
		return nil, err
	}
	return c.Client.Do(req)
}

func (c *Client) PostSessionMessagesWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) {
	req, err := NewPostSessionMessagesRequestWithBody(c.Server, contentType, body)
	if err != nil {
		return nil, err
	}
	req = req.WithContext(ctx)
	if err := c.applyEditors(ctx, req, reqEditors); err != nil {
		return nil, err
	}
	return c.Client.Do(req)
}

func (c *Client) PostSessionMessages(ctx context.Context, body PostSessionMessagesJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) {
	req, err := NewPostSessionMessagesRequest(c.Server, body)
	if err != nil {
		return nil, err
	}
	req = req.WithContext(ctx)
	if err := c.applyEditors(ctx, req, reqEditors); err != nil {
		return nil, err
	}
	return c.Client.Do(req)
}

func (c *Client) PostSessionShareWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) {
	req, err := NewPostSessionShareRequestWithBody(c.Server, contentType, body)
	if err != nil {
		return nil, err
	}
	req = req.WithContext(ctx)
	if err := c.applyEditors(ctx, req, reqEditors); err != nil {
		return nil, err
	}
	return c.Client.Do(req)
}

func (c *Client) PostSessionShare(ctx context.Context, body PostSessionShareJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) {
	req, err := NewPostSessionShareRequest(c.Server, body)
	if err != nil {
		return nil, err
	}
	req = req.WithContext(ctx)
	if err := c.applyEditors(ctx, req, reqEditors); err != nil {
		return nil, err
	}
	return c.Client.Do(req)
}

// NewGetEventRequest generates requests for GetEvent
func NewGetEventRequest(server string) (*http.Request, error) {
	var err error

	serverURL, err := url.Parse(server)
	if err != nil {
		return nil, err
	}

	operationPath := fmt.Sprintf("/event")
	if operationPath[0] == '/' {
		operationPath = "." + operationPath
	}

	queryURL, err := serverURL.Parse(operationPath)
	if err != nil {
		return nil, err
	}

	req, err := http.NewRequest("GET", queryURL.String(), nil)
	if err != nil {
		return nil, err
	}

	return req, nil
}

// NewPostProviderListRequest generates requests for PostProviderList
func NewPostProviderListRequest(server string) (*http.Request, error) {
	var err error

	serverURL, err := url.Parse(server)
	if err != nil {
		return nil, err
	}

	operationPath := fmt.Sprintf("/provider_list")
	if operationPath[0] == '/' {
		operationPath = "." + operationPath
	}

	queryURL, err := serverURL.Parse(operationPath)
	if err != nil {
		return nil, err
	}

	req, err := http.NewRequest("POST", queryURL.String(), nil)
	if err != nil {
		return nil, err
	}

	return req, nil
}

// NewPostSessionAbortRequest calls the generic PostSessionAbort builder with application/json body
func NewPostSessionAbortRequest(server string, body PostSessionAbortJSONRequestBody) (*http.Request, error) {
	var bodyReader io.Reader
	buf, err := json.Marshal(body)
	if err != nil {
		return nil, err
	}
	bodyReader = bytes.NewReader(buf)
	return NewPostSessionAbortRequestWithBody(server, "application/json", bodyReader)
}

// NewPostSessionAbortRequestWithBody generates requests for PostSessionAbort with any type of body
func NewPostSessionAbortRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) {
	var err error

	serverURL, err := url.Parse(server)
	if err != nil {
		return nil, err
	}

	operationPath := fmt.Sprintf("/session_abort")
	if operationPath[0] == '/' {
		operationPath = "." + operationPath
	}

	queryURL, err := serverURL.Parse(operationPath)
	if err != nil {
		return nil, err
	}

	req, err := http.NewRequest("POST", queryURL.String(), body)
	if err != nil {
		return nil, err
	}

	req.Header.Add("Content-Type", contentType)

	return req, nil
}

// NewPostSessionChatRequest calls the generic PostSessionChat builder with application/json body
func NewPostSessionChatRequest(server string, body PostSessionChatJSONRequestBody) (*http.Request, error) {
	var bodyReader io.Reader
	buf, err := json.Marshal(body)
	if err != nil {
		return nil, err
	}
	bodyReader = bytes.NewReader(buf)
	return NewPostSessionChatRequestWithBody(server, "application/json", bodyReader)
}

// NewPostSessionChatRequestWithBody generates requests for PostSessionChat with any type of body
func NewPostSessionChatRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) {
	var err error

	serverURL, err := url.Parse(server)
	if err != nil {
		return nil, err
	}

	operationPath := fmt.Sprintf("/session_chat")
	if operationPath[0] == '/' {
		operationPath = "." + operationPath
	}

	queryURL, err := serverURL.Parse(operationPath)
	if err != nil {
		return nil, err
	}

	req, err := http.NewRequest("POST", queryURL.String(), body)
	if err != nil {
		return nil, err
	}

	req.Header.Add("Content-Type", contentType)

	return req, nil
}

// NewPostSessionCreateRequest generates requests for PostSessionCreate
func NewPostSessionCreateRequest(server string) (*http.Request, error) {
	var err error

	serverURL, err := url.Parse(server)
	if err != nil {
		return nil, err
	}

	operationPath := fmt.Sprintf("/session_create")
	if operationPath[0] == '/' {
		operationPath = "." + operationPath
	}

	queryURL, err := serverURL.Parse(operationPath)
	if err != nil {
		return nil, err
	}

	req, err := http.NewRequest("POST", queryURL.String(), nil)
	if err != nil {
		return nil, err
	}

	return req, nil
}

// NewPostSessionListRequest generates requests for PostSessionList
func NewPostSessionListRequest(server string) (*http.Request, error) {
	var err error

	serverURL, err := url.Parse(server)
	if err != nil {
		return nil, err
	}

	operationPath := fmt.Sprintf("/session_list")
	if operationPath[0] == '/' {
		operationPath = "." + operationPath
	}

	queryURL, err := serverURL.Parse(operationPath)
	if err != nil {
		return nil, err
	}

	req, err := http.NewRequest("POST", queryURL.String(), nil)
	if err != nil {
		return nil, err
	}

	return req, nil
}

// NewPostSessionMessagesRequest calls the generic PostSessionMessages builder with application/json body
func NewPostSessionMessagesRequest(server string, body PostSessionMessagesJSONRequestBody) (*http.Request, error) {
	var bodyReader io.Reader
	buf, err := json.Marshal(body)
	if err != nil {
		return nil, err
	}
	bodyReader = bytes.NewReader(buf)
	return NewPostSessionMessagesRequestWithBody(server, "application/json", bodyReader)
}

// NewPostSessionMessagesRequestWithBody generates requests for PostSessionMessages with any type of body
func NewPostSessionMessagesRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) {
	var err error

	serverURL, err := url.Parse(server)
	if err != nil {
		return nil, err
	}

	operationPath := fmt.Sprintf("/session_messages")
	if operationPath[0] == '/' {
		operationPath = "." + operationPath
	}

	queryURL, err := serverURL.Parse(operationPath)
	if err != nil {
		return nil, err
	}

	req, err := http.NewRequest("POST", queryURL.String(), body)
	if err != nil {
		return nil, err
	}

	req.Header.Add("Content-Type", contentType)

	return req, nil
}

// NewPostSessionShareRequest calls the generic PostSessionShare builder with application/json body
func NewPostSessionShareRequest(server string, body PostSessionShareJSONRequestBody) (*http.Request, error) {
	var bodyReader io.Reader
	buf, err := json.Marshal(body)
	if err != nil {
		return nil, err
	}
	bodyReader = bytes.NewReader(buf)
	return NewPostSessionShareRequestWithBody(server, "application/json", bodyReader)
}

// NewPostSessionShareRequestWithBody generates requests for PostSessionShare with any type of body
func NewPostSessionShareRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) {
	var err error

	serverURL, err := url.Parse(server)
	if err != nil {
		return nil, err
	}

	operationPath := fmt.Sprintf("/session_share")
	if operationPath[0] == '/' {
		operationPath = "." + operationPath
	}

	queryURL, err := serverURL.Parse(operationPath)
	if err != nil {
		return nil, err
	}

	req, err := http.NewRequest("POST", queryURL.String(), body)
	if err != nil {
		return nil, err
	}

	req.Header.Add("Content-Type", contentType)

	return req, nil
}

func (c *Client) applyEditors(ctx context.Context, req *http.Request, additionalEditors []RequestEditorFn) error {
	for _, r := range c.RequestEditors {
		if err := r(ctx, req); err != nil {
			return err
		}
	}
	for _, r := range additionalEditors {
		if err := r(ctx, req); err != nil {
			return err
		}
	}
	return nil
}

// ClientWithResponses builds on ClientInterface to offer response payloads
type ClientWithResponses struct {
	ClientInterface
}

// NewClientWithResponses creates a new ClientWithResponses, which wraps
// Client with return type handling
func NewClientWithResponses(server string, opts ...ClientOption) (*ClientWithResponses, error) {
	client, err := NewClient(server, opts...)
	if err != nil {
		return nil, err
	}
	return &ClientWithResponses{client}, nil
}

// WithBaseURL overrides the baseURL.
func WithBaseURL(baseURL string) ClientOption {
	return func(c *Client) error {
		newBaseURL, err := url.Parse(baseURL)
		if err != nil {
			return err
		}
		c.Server = newBaseURL.String()
		return nil
	}
}

// ClientWithResponsesInterface is the interface specification for the client with responses above.
type ClientWithResponsesInterface interface {
	// GetEventWithResponse request
	GetEventWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetEventResponse, error)

	// PostProviderListWithResponse request
	PostProviderListWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*PostProviderListResponse, error)

	// PostSessionAbortWithBodyWithResponse request with any body
	PostSessionAbortWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PostSessionAbortResponse, error)

	PostSessionAbortWithResponse(ctx context.Context, body PostSessionAbortJSONRequestBody, reqEditors ...RequestEditorFn) (*PostSessionAbortResponse, error)

	// PostSessionChatWithBodyWithResponse request with any body
	PostSessionChatWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PostSessionChatResponse, error)

	PostSessionChatWithResponse(ctx context.Context, body PostSessionChatJSONRequestBody, reqEditors ...RequestEditorFn) (*PostSessionChatResponse, error)

	// PostSessionCreateWithResponse request
	PostSessionCreateWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*PostSessionCreateResponse, error)

	// PostSessionListWithResponse request
	PostSessionListWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*PostSessionListResponse, error)

	// PostSessionMessagesWithBodyWithResponse request with any body
	PostSessionMessagesWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PostSessionMessagesResponse, error)

	PostSessionMessagesWithResponse(ctx context.Context, body PostSessionMessagesJSONRequestBody, reqEditors ...RequestEditorFn) (*PostSessionMessagesResponse, error)

	// PostSessionShareWithBodyWithResponse request with any body
	PostSessionShareWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PostSessionShareResponse, error)

	PostSessionShareWithResponse(ctx context.Context, body PostSessionShareJSONRequestBody, reqEditors ...RequestEditorFn) (*PostSessionShareResponse, error)
}

type GetEventResponse struct {
	Body         []byte
	HTTPResponse *http.Response
	JSON200      *Event
}

// Status returns HTTPResponse.Status
func (r GetEventResponse) Status() string {
	if r.HTTPResponse != nil {
		return r.HTTPResponse.Status
	}
	return http.StatusText(0)
}

// StatusCode returns HTTPResponse.StatusCode
func (r GetEventResponse) StatusCode() int {
	if r.HTTPResponse != nil {
		return r.HTTPResponse.StatusCode
	}
	return 0
}

type PostProviderListResponse struct {
	Body         []byte
	HTTPResponse *http.Response
	JSON200      *map[string]ProviderInfo
}

// Status returns HTTPResponse.Status
func (r PostProviderListResponse) Status() string {
	if r.HTTPResponse != nil {
		return r.HTTPResponse.Status
	}
	return http.StatusText(0)
}

// StatusCode returns HTTPResponse.StatusCode
func (r PostProviderListResponse) StatusCode() int {
	if r.HTTPResponse != nil {
		return r.HTTPResponse.StatusCode
	}
	return 0
}

type PostSessionAbortResponse struct {
	Body         []byte
	HTTPResponse *http.Response
	JSON200      *bool
}

// Status returns HTTPResponse.Status
func (r PostSessionAbortResponse) Status() string {
	if r.HTTPResponse != nil {
		return r.HTTPResponse.Status
	}
	return http.StatusText(0)
}

// StatusCode returns HTTPResponse.StatusCode
func (r PostSessionAbortResponse) StatusCode() int {
	if r.HTTPResponse != nil {
		return r.HTTPResponse.StatusCode
	}
	return 0
}

type PostSessionChatResponse struct {
	Body         []byte
	HTTPResponse *http.Response
	JSON200      *MessageInfo
}

// Status returns HTTPResponse.Status
func (r PostSessionChatResponse) Status() string {
	if r.HTTPResponse != nil {
		return r.HTTPResponse.Status
	}
	return http.StatusText(0)
}

// StatusCode returns HTTPResponse.StatusCode
func (r PostSessionChatResponse) StatusCode() int {
	if r.HTTPResponse != nil {
		return r.HTTPResponse.StatusCode
	}
	return 0
}

type PostSessionCreateResponse struct {
	Body         []byte
	HTTPResponse *http.Response
	JSON200      *SessionInfo
}

// Status returns HTTPResponse.Status
func (r PostSessionCreateResponse) Status() string {
	if r.HTTPResponse != nil {
		return r.HTTPResponse.Status
	}
	return http.StatusText(0)
}

// StatusCode returns HTTPResponse.StatusCode
func (r PostSessionCreateResponse) StatusCode() int {
	if r.HTTPResponse != nil {
		return r.HTTPResponse.StatusCode
	}
	return 0
}

type PostSessionListResponse struct {
	Body         []byte
	HTTPResponse *http.Response
	JSON200      *[]SessionInfo
}

// Status returns HTTPResponse.Status
func (r PostSessionListResponse) Status() string {
	if r.HTTPResponse != nil {
		return r.HTTPResponse.Status
	}
	return http.StatusText(0)
}

// StatusCode returns HTTPResponse.StatusCode
func (r PostSessionListResponse) StatusCode() int {
	if r.HTTPResponse != nil {
		return r.HTTPResponse.StatusCode
	}
	return 0
}

type PostSessionMessagesResponse struct {
	Body         []byte
	HTTPResponse *http.Response
	JSON200      *[]MessageInfo
}

// Status returns HTTPResponse.Status
func (r PostSessionMessagesResponse) Status() string {
	if r.HTTPResponse != nil {
		return r.HTTPResponse.Status
	}
	return http.StatusText(0)
}

// StatusCode returns HTTPResponse.StatusCode
func (r PostSessionMessagesResponse) StatusCode() int {
	if r.HTTPResponse != nil {
		return r.HTTPResponse.StatusCode
	}
	return 0
}

type PostSessionShareResponse struct {
	Body         []byte
	HTTPResponse *http.Response
	JSON200      *SessionInfo
}

// Status returns HTTPResponse.Status
func (r PostSessionShareResponse) Status() string {
	if r.HTTPResponse != nil {
		return r.HTTPResponse.Status
	}
	return http.StatusText(0)
}

// StatusCode returns HTTPResponse.StatusCode
func (r PostSessionShareResponse) StatusCode() int {
	if r.HTTPResponse != nil {
		return r.HTTPResponse.StatusCode
	}
	return 0
}

// GetEventWithResponse request returning *GetEventResponse
func (c *ClientWithResponses) GetEventWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetEventResponse, error) {
	rsp, err := c.GetEvent(ctx, reqEditors...)
	if err != nil {
		return nil, err
	}
	return ParseGetEventResponse(rsp)
}

// PostProviderListWithResponse request returning *PostProviderListResponse
func (c *ClientWithResponses) PostProviderListWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*PostProviderListResponse, error) {
	rsp, err := c.PostProviderList(ctx, reqEditors...)
	if err != nil {
		return nil, err
	}
	return ParsePostProviderListResponse(rsp)
}

// PostSessionAbortWithBodyWithResponse request with arbitrary body returning *PostSessionAbortResponse
func (c *ClientWithResponses) PostSessionAbortWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PostSessionAbortResponse, error) {
	rsp, err := c.PostSessionAbortWithBody(ctx, contentType, body, reqEditors...)
	if err != nil {
		return nil, err
	}
	return ParsePostSessionAbortResponse(rsp)
}

func (c *ClientWithResponses) PostSessionAbortWithResponse(ctx context.Context, body PostSessionAbortJSONRequestBody, reqEditors ...RequestEditorFn) (*PostSessionAbortResponse, error) {
	rsp, err := c.PostSessionAbort(ctx, body, reqEditors...)
	if err != nil {
		return nil, err
	}
	return ParsePostSessionAbortResponse(rsp)
}

// PostSessionChatWithBodyWithResponse request with arbitrary body returning *PostSessionChatResponse
func (c *ClientWithResponses) PostSessionChatWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PostSessionChatResponse, error) {
	rsp, err := c.PostSessionChatWithBody(ctx, contentType, body, reqEditors...)
	if err != nil {
		return nil, err
	}
	return ParsePostSessionChatResponse(rsp)
}

func (c *ClientWithResponses) PostSessionChatWithResponse(ctx context.Context, body PostSessionChatJSONRequestBody, reqEditors ...RequestEditorFn) (*PostSessionChatResponse, error) {
	rsp, err := c.PostSessionChat(ctx, body, reqEditors...)
	if err != nil {
		return nil, err
	}
	return ParsePostSessionChatResponse(rsp)
}

// PostSessionCreateWithResponse request returning *PostSessionCreateResponse
func (c *ClientWithResponses) PostSessionCreateWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*PostSessionCreateResponse, error) {
	rsp, err := c.PostSessionCreate(ctx, reqEditors...)
	if err != nil {
		return nil, err
	}
	return ParsePostSessionCreateResponse(rsp)
}

// PostSessionListWithResponse request returning *PostSessionListResponse
func (c *ClientWithResponses) PostSessionListWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*PostSessionListResponse, error) {
	rsp, err := c.PostSessionList(ctx, reqEditors...)
	if err != nil {
		return nil, err
	}
	return ParsePostSessionListResponse(rsp)
}

// PostSessionMessagesWithBodyWithResponse request with arbitrary body returning *PostSessionMessagesResponse
func (c *ClientWithResponses) PostSessionMessagesWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PostSessionMessagesResponse, error) {
	rsp, err := c.PostSessionMessagesWithBody(ctx, contentType, body, reqEditors...)
	if err != nil {
		return nil, err
	}
	return ParsePostSessionMessagesResponse(rsp)
}

func (c *ClientWithResponses) PostSessionMessagesWithResponse(ctx context.Context, body PostSessionMessagesJSONRequestBody, reqEditors ...RequestEditorFn) (*PostSessionMessagesResponse, error) {
	rsp, err := c.PostSessionMessages(ctx, body, reqEditors...)
	if err != nil {
		return nil, err
	}
	return ParsePostSessionMessagesResponse(rsp)
}

// PostSessionShareWithBodyWithResponse request with arbitrary body returning *PostSessionShareResponse
func (c *ClientWithResponses) PostSessionShareWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PostSessionShareResponse, error) {
	rsp, err := c.PostSessionShareWithBody(ctx, contentType, body, reqEditors...)
	if err != nil {
		return nil, err
	}
	return ParsePostSessionShareResponse(rsp)
}

func (c *ClientWithResponses) PostSessionShareWithResponse(ctx context.Context, body PostSessionShareJSONRequestBody, reqEditors ...RequestEditorFn) (*PostSessionShareResponse, error) {
	rsp, err := c.PostSessionShare(ctx, body, reqEditors...)
	if err != nil {
		return nil, err
	}
	return ParsePostSessionShareResponse(rsp)
}

// ParseGetEventResponse parses an HTTP response from a GetEventWithResponse call
func ParseGetEventResponse(rsp *http.Response) (*GetEventResponse, error) {
	bodyBytes, err := io.ReadAll(rsp.Body)
	defer func() { _ = rsp.Body.Close() }()
	if err != nil {
		return nil, err
	}

	response := &GetEventResponse{
		Body:         bodyBytes,
		HTTPResponse: rsp,
	}

	switch {
	case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200:
		var dest Event
		if err := json.Unmarshal(bodyBytes, &dest); err != nil {
			return nil, err
		}
		response.JSON200 = &dest

	}

	return response, nil
}

// ParsePostProviderListResponse parses an HTTP response from a PostProviderListWithResponse call
func ParsePostProviderListResponse(rsp *http.Response) (*PostProviderListResponse, error) {
	bodyBytes, err := io.ReadAll(rsp.Body)
	defer func() { _ = rsp.Body.Close() }()
	if err != nil {
		return nil, err
	}

	response := &PostProviderListResponse{
		Body:         bodyBytes,
		HTTPResponse: rsp,
	}

	switch {
	case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200:
		var dest map[string]ProviderInfo
		if err := json.Unmarshal(bodyBytes, &dest); err != nil {
			return nil, err
		}
		response.JSON200 = &dest

	}

	return response, nil
}

// ParsePostSessionAbortResponse parses an HTTP response from a PostSessionAbortWithResponse call
func ParsePostSessionAbortResponse(rsp *http.Response) (*PostSessionAbortResponse, error) {
	bodyBytes, err := io.ReadAll(rsp.Body)
	defer func() { _ = rsp.Body.Close() }()
	if err != nil {
		return nil, err
	}

	response := &PostSessionAbortResponse{
		Body:         bodyBytes,
		HTTPResponse: rsp,
	}

	switch {
	case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200:
		var dest bool
		if err := json.Unmarshal(bodyBytes, &dest); err != nil {
			return nil, err
		}
		response.JSON200 = &dest

	}

	return response, nil
}

// ParsePostSessionChatResponse parses an HTTP response from a PostSessionChatWithResponse call
func ParsePostSessionChatResponse(rsp *http.Response) (*PostSessionChatResponse, error) {
	bodyBytes, err := io.ReadAll(rsp.Body)
	defer func() { _ = rsp.Body.Close() }()
	if err != nil {
		return nil, err
	}

	response := &PostSessionChatResponse{
		Body:         bodyBytes,
		HTTPResponse: rsp,
	}

	switch {
	case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200:
		var dest MessageInfo
		if err := json.Unmarshal(bodyBytes, &dest); err != nil {
			return nil, err
		}
		response.JSON200 = &dest

	}

	return response, nil
}

// ParsePostSessionCreateResponse parses an HTTP response from a PostSessionCreateWithResponse call
func ParsePostSessionCreateResponse(rsp *http.Response) (*PostSessionCreateResponse, error) {
	bodyBytes, err := io.ReadAll(rsp.Body)
	defer func() { _ = rsp.Body.Close() }()
	if err != nil {
		return nil, err
	}

	response := &PostSessionCreateResponse{
		Body:         bodyBytes,
		HTTPResponse: rsp,
	}

	switch {
	case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200:
		var dest SessionInfo
		if err := json.Unmarshal(bodyBytes, &dest); err != nil {
			return nil, err
		}
		response.JSON200 = &dest

	}

	return response, nil
}

// ParsePostSessionListResponse parses an HTTP response from a PostSessionListWithResponse call
func ParsePostSessionListResponse(rsp *http.Response) (*PostSessionListResponse, error) {
	bodyBytes, err := io.ReadAll(rsp.Body)
	defer func() { _ = rsp.Body.Close() }()
	if err != nil {
		return nil, err
	}

	response := &PostSessionListResponse{
		Body:         bodyBytes,
		HTTPResponse: rsp,
	}

	switch {
	case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200:
		var dest []SessionInfo
		if err := json.Unmarshal(bodyBytes, &dest); err != nil {
			return nil, err
		}
		response.JSON200 = &dest

	}

	return response, nil
}

// ParsePostSessionMessagesResponse parses an HTTP response from a PostSessionMessagesWithResponse call
func ParsePostSessionMessagesResponse(rsp *http.Response) (*PostSessionMessagesResponse, error) {
	bodyBytes, err := io.ReadAll(rsp.Body)
	defer func() { _ = rsp.Body.Close() }()
	if err != nil {
		return nil, err
	}

	response := &PostSessionMessagesResponse{
		Body:         bodyBytes,
		HTTPResponse: rsp,
	}

	switch {
	case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200:
		var dest []MessageInfo
		if err := json.Unmarshal(bodyBytes, &dest); err != nil {
			return nil, err
		}
		response.JSON200 = &dest

	}

	return response, nil
}

// ParsePostSessionShareResponse parses an HTTP response from a PostSessionShareWithResponse call
func ParsePostSessionShareResponse(rsp *http.Response) (*PostSessionShareResponse, error) {
	bodyBytes, err := io.ReadAll(rsp.Body)
	defer func() { _ = rsp.Body.Close() }()
	if err != nil {
		return nil, err
	}

	response := &PostSessionShareResponse{
		Body:         bodyBytes,
		HTTPResponse: rsp,
	}

	switch {
	case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200:
		var dest SessionInfo
		if err := json.Unmarshal(bodyBytes, &dest); err != nil {
			return nil, err
		}
		response.JSON200 = &dest

	}

	return response, nil
}
