// Code generated by go-swagger; DO NOT EDIT.

package rest_model_zrok

// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command

import (
	"context"
	"encoding/json"
	"strconv"

	"github.com/go-openapi/errors"
	"github.com/go-openapi/strfmt"
	"github.com/go-openapi/swag"
	"github.com/go-openapi/validate"
)

// ShareRequest share request
//
// swagger:model shareRequest
type ShareRequest struct {

	// access grants
	AccessGrants []string `json:"accessGrants"`

	// auth scheme
	AuthScheme string `json:"authScheme,omitempty"`

	// auth users
	AuthUsers []*AuthUser `json:"authUsers"`

	// backend mode
	// Enum: [proxy web tcpTunnel udpTunnel caddy drive socks vpn]
	BackendMode string `json:"backendMode,omitempty"`

	// backend proxy endpoint
	BackendProxyEndpoint string `json:"backendProxyEndpoint,omitempty"`

	// env z Id
	EnvZID string `json:"envZId,omitempty"`

	// frontend selection
	FrontendSelection []string `json:"frontendSelection"`

	// oauth authorization check interval
	OauthAuthorizationCheckInterval string `json:"oauthAuthorizationCheckInterval,omitempty"`

	// oauth email domains
	OauthEmailDomains []string `json:"oauthEmailDomains"`

	// oauth provider
	// Enum: [github google]
	OauthProvider string `json:"oauthProvider,omitempty"`

	// permission mode
	// Enum: [open closed]
	PermissionMode string `json:"permissionMode,omitempty"`

	// reserved
	Reserved bool `json:"reserved,omitempty"`

	// share mode
	// Enum: [public private]
	ShareMode string `json:"shareMode,omitempty"`

	// unique name
	UniqueName string `json:"uniqueName,omitempty"`
}

// Validate validates this share request
func (m *ShareRequest) Validate(formats strfmt.Registry) error {
	var res []error

	if err := m.validateAuthUsers(formats); err != nil {
		res = append(res, err)
	}

	if err := m.validateBackendMode(formats); err != nil {
		res = append(res, err)
	}

	if err := m.validateOauthProvider(formats); err != nil {
		res = append(res, err)
	}

	if err := m.validatePermissionMode(formats); err != nil {
		res = append(res, err)
	}

	if err := m.validateShareMode(formats); err != nil {
		res = append(res, err)
	}

	if len(res) > 0 {
		return errors.CompositeValidationError(res...)
	}
	return nil
}

func (m *ShareRequest) validateAuthUsers(formats strfmt.Registry) error {
	if swag.IsZero(m.AuthUsers) { // not required
		return nil
	}

	for i := 0; i < len(m.AuthUsers); i++ {
		if swag.IsZero(m.AuthUsers[i]) { // not required
			continue
		}

		if m.AuthUsers[i] != nil {
			if err := m.AuthUsers[i].Validate(formats); err != nil {
				if ve, ok := err.(*errors.Validation); ok {
					return ve.ValidateName("authUsers" + "." + strconv.Itoa(i))
				} else if ce, ok := err.(*errors.CompositeError); ok {
					return ce.ValidateName("authUsers" + "." + strconv.Itoa(i))
				}
				return err
			}
		}

	}

	return nil
}

var shareRequestTypeBackendModePropEnum []interface{}

func init() {
	var res []string
	if err := json.Unmarshal([]byte(`["proxy","web","tcpTunnel","udpTunnel","caddy","drive","socks","vpn"]`), &res); err != nil {
		panic(err)
	}
	for _, v := range res {
		shareRequestTypeBackendModePropEnum = append(shareRequestTypeBackendModePropEnum, v)
	}
}

const (

	// ShareRequestBackendModeProxy captures enum value "proxy"
	ShareRequestBackendModeProxy string = "proxy"

	// ShareRequestBackendModeWeb captures enum value "web"
	ShareRequestBackendModeWeb string = "web"

	// ShareRequestBackendModeTCPTunnel captures enum value "tcpTunnel"
	ShareRequestBackendModeTCPTunnel string = "tcpTunnel"

	// ShareRequestBackendModeUDPTunnel captures enum value "udpTunnel"
	ShareRequestBackendModeUDPTunnel string = "udpTunnel"

	// ShareRequestBackendModeCaddy captures enum value "caddy"
	ShareRequestBackendModeCaddy string = "caddy"

	// ShareRequestBackendModeDrive captures enum value "drive"
	ShareRequestBackendModeDrive string = "drive"

	// ShareRequestBackendModeSocks captures enum value "socks"
	ShareRequestBackendModeSocks string = "socks"

	// ShareRequestBackendModeVpn captures enum value "vpn"
	ShareRequestBackendModeVpn string = "vpn"
)

// prop value enum
func (m *ShareRequest) validateBackendModeEnum(path, location string, value string) error {
	if err := validate.EnumCase(path, location, value, shareRequestTypeBackendModePropEnum, true); err != nil {
		return err
	}
	return nil
}

func (m *ShareRequest) validateBackendMode(formats strfmt.Registry) error {
	if swag.IsZero(m.BackendMode) { // not required
		return nil
	}

	// value enum
	if err := m.validateBackendModeEnum("backendMode", "body", m.BackendMode); err != nil {
		return err
	}

	return nil
}

var shareRequestTypeOauthProviderPropEnum []interface{}

func init() {
	var res []string
	if err := json.Unmarshal([]byte(`["github","google"]`), &res); err != nil {
		panic(err)
	}
	for _, v := range res {
		shareRequestTypeOauthProviderPropEnum = append(shareRequestTypeOauthProviderPropEnum, v)
	}
}

const (

	// ShareRequestOauthProviderGithub captures enum value "github"
	ShareRequestOauthProviderGithub string = "github"

	// ShareRequestOauthProviderGoogle captures enum value "google"
	ShareRequestOauthProviderGoogle string = "google"
)

// prop value enum
func (m *ShareRequest) validateOauthProviderEnum(path, location string, value string) error {
	if err := validate.EnumCase(path, location, value, shareRequestTypeOauthProviderPropEnum, true); err != nil {
		return err
	}
	return nil
}

func (m *ShareRequest) validateOauthProvider(formats strfmt.Registry) error {
	if swag.IsZero(m.OauthProvider) { // not required
		return nil
	}

	// value enum
	if err := m.validateOauthProviderEnum("oauthProvider", "body", m.OauthProvider); err != nil {
		return err
	}

	return nil
}

var shareRequestTypePermissionModePropEnum []interface{}

func init() {
	var res []string
	if err := json.Unmarshal([]byte(`["open","closed"]`), &res); err != nil {
		panic(err)
	}
	for _, v := range res {
		shareRequestTypePermissionModePropEnum = append(shareRequestTypePermissionModePropEnum, v)
	}
}

const (

	// ShareRequestPermissionModeOpen captures enum value "open"
	ShareRequestPermissionModeOpen string = "open"

	// ShareRequestPermissionModeClosed captures enum value "closed"
	ShareRequestPermissionModeClosed string = "closed"
)

// prop value enum
func (m *ShareRequest) validatePermissionModeEnum(path, location string, value string) error {
	if err := validate.EnumCase(path, location, value, shareRequestTypePermissionModePropEnum, true); err != nil {
		return err
	}
	return nil
}

func (m *ShareRequest) validatePermissionMode(formats strfmt.Registry) error {
	if swag.IsZero(m.PermissionMode) { // not required
		return nil
	}

	// value enum
	if err := m.validatePermissionModeEnum("permissionMode", "body", m.PermissionMode); err != nil {
		return err
	}

	return nil
}

var shareRequestTypeShareModePropEnum []interface{}

func init() {
	var res []string
	if err := json.Unmarshal([]byte(`["public","private"]`), &res); err != nil {
		panic(err)
	}
	for _, v := range res {
		shareRequestTypeShareModePropEnum = append(shareRequestTypeShareModePropEnum, v)
	}
}

const (

	// ShareRequestShareModePublic captures enum value "public"
	ShareRequestShareModePublic string = "public"

	// ShareRequestShareModePrivate captures enum value "private"
	ShareRequestShareModePrivate string = "private"
)

// prop value enum
func (m *ShareRequest) validateShareModeEnum(path, location string, value string) error {
	if err := validate.EnumCase(path, location, value, shareRequestTypeShareModePropEnum, true); err != nil {
		return err
	}
	return nil
}

func (m *ShareRequest) validateShareMode(formats strfmt.Registry) error {
	if swag.IsZero(m.ShareMode) { // not required
		return nil
	}

	// value enum
	if err := m.validateShareModeEnum("shareMode", "body", m.ShareMode); err != nil {
		return err
	}

	return nil
}

// ContextValidate validate this share request based on the context it is used
func (m *ShareRequest) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
	var res []error

	if err := m.contextValidateAuthUsers(ctx, formats); err != nil {
		res = append(res, err)
	}

	if len(res) > 0 {
		return errors.CompositeValidationError(res...)
	}
	return nil
}

func (m *ShareRequest) contextValidateAuthUsers(ctx context.Context, formats strfmt.Registry) error {

	for i := 0; i < len(m.AuthUsers); i++ {

		if m.AuthUsers[i] != nil {

			if swag.IsZero(m.AuthUsers[i]) { // not required
				return nil
			}

			if err := m.AuthUsers[i].ContextValidate(ctx, formats); err != nil {
				if ve, ok := err.(*errors.Validation); ok {
					return ve.ValidateName("authUsers" + "." + strconv.Itoa(i))
				} else if ce, ok := err.(*errors.CompositeError); ok {
					return ce.ValidateName("authUsers" + "." + strconv.Itoa(i))
				}
				return err
			}
		}

	}

	return nil
}

// MarshalBinary interface implementation
func (m *ShareRequest) MarshalBinary() ([]byte, error) {
	if m == nil {
		return nil, nil
	}
	return swag.WriteJSON(m)
}

// UnmarshalBinary interface implementation
func (m *ShareRequest) UnmarshalBinary(b []byte) error {
	var res ShareRequest
	if err := swag.ReadJSON(b, &res); err != nil {
		return err
	}
	*m = res
	return nil
}