func()

in statefun-sdk-go/v3/pkg/statefun/handler.go [74:121]


func (h *handler) WithSpec(spec StatefulFunctionSpec) error {
	log.Printf("registering Stateful Function %v\n", spec.FunctionType)
	if _, exists := h.module[spec.FunctionType]; exists {
		err := fmt.Errorf("failed to register Stateful Function %s, there is already a spec registered under that type", spec.FunctionType)
		log.Println(err.Error())
		return err
	}

	if spec.Function == nil {
		err := fmt.Errorf("failed to register Stateful Function %s, the Function instance cannot be nil", spec.FunctionType)
		log.Println(err.Error())
		return err
	}

	valueSpecs := make(map[string]*protocol.FromFunction_PersistedValueSpec, len(spec.States))

	for _, state := range spec.States {
		log.Printf("registering state specification %v\n", state)
		if err := validateValueSpec(state); err != nil {
			err := fmt.Errorf("failed to register Stateful Function %s: %w", spec.FunctionType, err)
			log.Println(err.Error())
			return err
		}

		expiration := &protocol.FromFunction_ExpirationSpec{}
		switch state.Expiration.expirationType {
		case none:
			expiration.Mode = protocol.FromFunction_ExpirationSpec_NONE
		case expireAfterWrite:
			expiration.Mode = protocol.FromFunction_ExpirationSpec_AFTER_WRITE
			expiration.ExpireAfterMillis = state.Expiration.duration.Milliseconds()
		case expireAfterCall:
			expiration.Mode = protocol.FromFunction_ExpirationSpec_AFTER_INVOKE
			expiration.ExpireAfterMillis = state.Expiration.duration.Milliseconds()
		}

		valueSpecs[state.Name] = &protocol.FromFunction_PersistedValueSpec{
			StateName:      state.Name,
			ExpirationSpec: expiration,
			TypeTypename:   state.ValueType.GetTypeName().String(),
		}
	}

	h.module[spec.FunctionType] = spec.Function
	h.stateSpecs[spec.FunctionType] = valueSpecs

	return nil
}