func ProtectedFieldsValidator(pairs map[string]interface{}) *Callback {
	return C("fire/ProtectedFieldsValidator", Only(Create, Update), func(ctx *Context) error {
		// handle resource creation
		if ctx.Operation == Create {
			// check all fields
			for field, def := range pairs {
				// skip fields that have no default
				if def == NoDefault {
					continue
				}

				// check equality
				if !reflect.DeepEqual(ctx.Model.MustGet(field), def) {
					return E("field " + field + " is protected")
				}
			}
		}

		// handle resource updates
		if ctx.Operation == Update {
			// read the original
			original, err := ctx.Original()
			if err != nil {
				return err
			}

			// check all fields
			for field := range pairs {
				// check equality
				if !reflect.DeepEqual(ctx.Model.MustGet(field), original.MustGet(field)) {
					return E("field " + field + " is protected")
				}
			}
		}

		return nil
	})
}
func ProtectedFieldsValidator(pairs map[string]interface{}) *Callback {
	return C("fire/ProtectedFieldsValidator", Only(Create, Update), func(ctx *Context) error {
		
		if ctx.Operation == Create {
			
			for field, def := range pairs {
				
				if def == NoDefault {
					continue
				}

				
				if !reflect.DeepEqual(ctx.Model.MustGet(field), def) {
					return E("field " + field + " is protected")
				}
			}
		}

		
		if ctx.Operation == Update {
			
			original, err := ctx.Original()
			if err != nil {
				return err
			}

			
			for field := range pairs {
				
				if !reflect.DeepEqual(ctx.Model.MustGet(field), original.MustGet(field)) {
					return E("field " + field + " is protected")
				}
			}
		}

		return nil
	})
}
func ProtectedFieldsValidator ( pairs map [ string ] interface { } ) * Callback { return C ( " " , Only ( Create , Update ) , func ( ctx * Context ) error { // handle resource creation if ctx . Operation == Create { // check all fields for field , def := range pairs { // skip fields that have no default if def == NoDefault { continue } // check equality if ! reflect . DeepEqual ( ctx . Model . MustGet ( field ) , def ) { return E ( " " + field + " " ) } } } // handle resource updates if ctx . Operation == Update { // read the original original , err := ctx . Original ( ) if err != nil { return err } // check all fields for field := range pairs { // check equality if ! reflect . DeepEqual ( ctx . Model . MustGet ( field ) , original . MustGet ( field ) ) { return E ( " " + field + " " ) } } } return nil } ) }
// ProtectedFieldsValidator compares protected fields against their default
// during Create (if provided) or stored value during Update and returns an error
// if they have been changed.
//
// Protected fields are defined by passing pairs of fields and default values:
//
//	fire.ProtectedFieldsValidator(map[string]interface{}{
//		"Title": NoDefault, // can only be set during Create
//		"Link":  "",        // default is fixed and cannot be changed
//	})
//
// The special NoDefault value can be provided to skip the default enforcement
// on Create.
ProtectedFieldsValidator compares protected fields against their default during Create ( if provided ) or stored value during Update and returns an error if they have been changed . Protected fields are defined by passing pairs of fields and default values : fire . ProtectedFieldsValidator ( map [ string ] interface {} { Title : NoDefault // can only be set during Create Link : // default is fixed and cannot be changed } ) The special NoDefault value can be provided to skip the default enforcement on Create .