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
}