diff --git a/v1/core/dispatcher.go b/v1/core/dispatcher.go index 0b66f3b..4ce6772 100644 --- a/v1/core/dispatcher.go +++ b/v1/core/dispatcher.go @@ -176,17 +176,15 @@ func (d *Dispatcher) handleUpdate(ctx context.Context, upd model.Update) { } st = c.State() - if st.State() == state.ClearState { + if st.IsEmpty() { if err := d.fsmStorage.Delete(ctx, isolation.Scope{UserID: upd.UserID, ChatID: upd.ChatID}); err != nil { log.Error().Err(err).Send() - return } + return } - if st.State() != "" { - if err := d.fsmStorage.Put(ctx, st.Snapshot()); err != nil { - log.Error().Err(err).Send() - return - } + + if err := d.fsmStorage.Put(ctx, st.Snapshot()); err != nil { + log.Error().Err(err).Send() } } diff --git a/v1/state/state.go b/v1/state/state.go index a71bff8..dee0d07 100644 --- a/v1/state/state.go +++ b/v1/state/state.go @@ -11,8 +11,6 @@ var ( ErrKeyNotFound = fmt.Errorf("state: key not found") ) -const ClearState State = "clear" - type State string type Codec interface { @@ -41,6 +39,7 @@ type Context struct { state State data map[string][]byte codec Codec + clear bool } type Option func(*Context) @@ -83,10 +82,15 @@ func (sc *Context) Set(state State) { func (sc *Context) State() State { return sc.state } func (sc *Context) Clear() { - sc.state = ClearState + sc.state = "" + sc.clear = true sc.data = make(map[string][]byte) } +func (sc *Context) IsEmpty() bool { + return sc.state == "" && sc.clear +} + func (sc *Context) Store(key string, val any) error { b, err := sc.codec.Marshal(val) if err != nil {