email-mcp/internal/secretstore/kwallet/store.go
2026-04-10 10:26:43 +02:00

56 lines
1.2 KiB
Go

package kwallet
import (
"context"
"email-mcp/internal/secretstore"
)
type Client interface {
IsAvailable(ctx context.Context) error
Open(ctx context.Context) error
WriteEntry(ctx context.Context, key string, value []byte) error
ReadEntry(ctx context.Context, key string) ([]byte, error)
}
type Store struct {
client Client
}
var _ secretstore.Store = (*Store)(nil)
func NewStore(client Client) *Store {
return &Store{client: client}
}
func (s *Store) Save(ctx context.Context, key string, cred secretstore.Credential) error {
if err := s.client.IsAvailable(ctx); err != nil {
return err
}
if err := s.client.Open(ctx); err != nil {
return err
}
data, err := secretstore.MarshalCredential(cred)
if err != nil {
return err
}
return s.client.WriteEntry(ctx, key, data)
}
func (s *Store) Load(ctx context.Context, key string) (secretstore.Credential, error) {
if err := s.client.IsAvailable(ctx); err != nil {
return secretstore.Credential{}, err
}
if err := s.client.Open(ctx); err != nil {
return secretstore.Credential{}, err
}
data, err := s.client.ReadEntry(ctx, key)
if err != nil {
return secretstore.Credential{}, err
}
return secretstore.UnmarshalCredential(data)
}