// Code generated by cdpgen. DO NOT EDIT.

package profiler

// GetBestEffortCoverageReply represents the return values for GetBestEffortCoverage in the Profiler domain.
type GetBestEffortCoverageReply struct {
	Result []ScriptCoverage `json:"result"` // Coverage data for the current isolate.
}

// SetSamplingIntervalArgs represents the arguments for SetSamplingInterval in the Profiler domain.
type SetSamplingIntervalArgs struct {
	Interval int `json:"interval"` // New sampling interval in microseconds.
}

// NewSetSamplingIntervalArgs initializes SetSamplingIntervalArgs with the required arguments.
func NewSetSamplingIntervalArgs(interval int) *SetSamplingIntervalArgs {
	args := new(SetSamplingIntervalArgs)
	args.Interval = interval
	return args
}

// StartPreciseCoverageArgs represents the arguments for StartPreciseCoverage in the Profiler domain.
type StartPreciseCoverageArgs struct {
	CallCount *bool `json:"callCount,omitempty"` // Collect accurate call counts beyond simple 'covered' or 'not covered'.
	Detailed  *bool `json:"detailed,omitempty"`  // Collect block-based coverage.
}

// NewStartPreciseCoverageArgs initializes StartPreciseCoverageArgs with the required arguments.
func NewStartPreciseCoverageArgs() *StartPreciseCoverageArgs {
	args := new(StartPreciseCoverageArgs)

	return args
}

// SetCallCount sets the CallCount optional argument. Collect accurate
// call counts beyond simple 'covered' or 'not covered'.
func (a *StartPreciseCoverageArgs) SetCallCount(callCount bool) *StartPreciseCoverageArgs {
	a.CallCount = &callCount
	return a
}

// SetDetailed sets the Detailed optional argument. Collect
// block-based coverage.
func (a *StartPreciseCoverageArgs) SetDetailed(detailed bool) *StartPreciseCoverageArgs {
	a.Detailed = &detailed
	return a
}

// StopReply represents the return values for Stop in the Profiler domain.
type StopReply struct {
	Profile Profile `json:"profile"` // Recorded profile.
}

// TakePreciseCoverageReply represents the return values for TakePreciseCoverage in the Profiler domain.
type TakePreciseCoverageReply struct {
	Result []ScriptCoverage `json:"result"` // Coverage data for the current isolate.
}

// TakeTypeProfileReply represents the return values for TakeTypeProfile in the Profiler domain.
type TakeTypeProfileReply struct {
	Result []ScriptTypeProfile `json:"result"` // Type profile for all scripts since startTypeProfile() was turned on.
}
