// Package io provides the Chrome DevTools Protocol
// commands, types, and events for the IO domain.
//
// Input/Output operations for streams produced by DevTools.
//
// Generated by the cdproto-gen command.
package io

// Code generated by cdproto-gen. DO NOT EDIT.

import (
	"context"

	"github.com/chromedp/cdproto/cdp"
	"github.com/chromedp/cdproto/runtime"
)

// CloseParams close the stream, discard any temporary backing storage.
type CloseParams struct {
	Handle StreamHandle `json:"handle"` // Handle of the stream to close.
}

// Close close the stream, discard any temporary backing storage.
//
// See: https://chromedevtools.github.io/devtools-protocol/tot/IO#method-close
//
// parameters:
//
//	handle - Handle of the stream to close.
func Close(handle StreamHandle) *CloseParams {
	return &CloseParams{
		Handle: handle,
	}
}

// Do executes IO.close against the provided context.
func (p *CloseParams) Do(ctx context.Context) (err error) {
	return cdp.Execute(ctx, CommandClose, p, nil)
}

// ReadParams read a chunk of the stream.
type ReadParams struct {
	Handle StreamHandle `json:"handle"`                    // Handle of the stream to read.
	Offset int64        `json:"offset,omitempty,omitzero"` // Seek to the specified offset before reading (if not specified, proceed with offset following the last read). Some types of streams may only support sequential reads.
	Size   int64        `json:"size,omitempty,omitzero"`   // Maximum number of bytes to read (left upon the agent discretion if not specified).
}

// Read read a chunk of the stream.
//
// See: https://chromedevtools.github.io/devtools-protocol/tot/IO#method-read
//
// parameters:
//
//	handle - Handle of the stream to read.
func Read(handle StreamHandle) *ReadParams {
	return &ReadParams{
		Handle: handle,
	}
}

// WithOffset seek to the specified offset before reading (if not specified,
// proceed with offset following the last read). Some types of streams may only
// support sequential reads.
func (p ReadParams) WithOffset(offset int64) *ReadParams {
	p.Offset = offset
	return &p
}

// WithSize maximum number of bytes to read (left upon the agent discretion
// if not specified).
func (p ReadParams) WithSize(size int64) *ReadParams {
	p.Size = size
	return &p
}

// ReadReturns return values.
type ReadReturns struct {
	Base64encoded bool   `json:"base64Encoded"`           // Set if the data is base64-encoded
	Data          string `json:"data,omitempty,omitzero"` // Data that were read.
	EOF           bool   `json:"eof"`                     // Set if the end-of-file condition occurred while reading.
}

// Do executes IO.read against the provided context.
//
// returns:
//
//	data - Data that were read.
//	eof - Set if the end-of-file condition occurred while reading.
func (p *ReadParams) Do(ctx context.Context) (data string, eof bool, err error) {
	// execute
	var res ReadReturns
	err = cdp.Execute(ctx, CommandRead, p, &res)
	if err != nil {
		return "", false, err
	}

	return res.Data, res.EOF, nil
}

// ResolveBlobParams return UUID of Blob object specified by a remote object
// id.
type ResolveBlobParams struct {
	ObjectID runtime.RemoteObjectID `json:"objectId"` // Object id of a Blob object wrapper.
}

// ResolveBlob return UUID of Blob object specified by a remote object id.
//
// See: https://chromedevtools.github.io/devtools-protocol/tot/IO#method-resolveBlob
//
// parameters:
//
//	objectID - Object id of a Blob object wrapper.
func ResolveBlob(objectID runtime.RemoteObjectID) *ResolveBlobParams {
	return &ResolveBlobParams{
		ObjectID: objectID,
	}
}

// ResolveBlobReturns return values.
type ResolveBlobReturns struct {
	UUID string `json:"uuid,omitempty,omitzero"` // UUID of the specified Blob.
}

// Do executes IO.resolveBlob against the provided context.
//
// returns:
//
//	uuid - UUID of the specified Blob.
func (p *ResolveBlobParams) Do(ctx context.Context) (uuid string, err error) {
	// execute
	var res ResolveBlobReturns
	err = cdp.Execute(ctx, CommandResolveBlob, p, &res)
	if err != nil {
		return "", err
	}

	return res.UUID, nil
}

// Command names.
const (
	CommandClose       = "IO.close"
	CommandRead        = "IO.read"
	CommandResolveBlob = "IO.resolveBlob"
)
