package storage import ( "errors" "fmt" "modernc.org/sqlite" ) var ( ErrInvalid = errors.New("storage: invalid input") ErrNotFound = errors.New("storage: not found") ErrConflict = errors.New("storage: conflict") ErrUIDExhausted = errors.New("storage: uid range exhausted") ErrGIDExhausted = errors.New("storage: gid range exhausted") ErrSchemaTooNew = errors.New("storage: schema newer than binary") ErrSchemaInvalid = errors.New("storage: schema invalid") ErrBusy = errors.New("storage: database busy") ErrLocked = errors.New("storage: database locked") ErrClosed = errors.New("storage: closed") ) func invalid(operation string, err error) error { return fmt.Errorf("%s: %w: %v", operation, ErrInvalid, err) } func classify(operation string, err error) error { if err == nil { return nil } var sqliteErr *sqlite.Error if errors.As(err, &sqliteErr) { switch sqliteErr.Code() & 0xff { case 5: return fmt.Errorf("%s: %w: %w", operation, ErrBusy, err) case 6: return fmt.Errorf("%s: %w: %w", operation, ErrLocked, err) case 19: return fmt.Errorf("%s: %w: %w", operation, ErrConflict, err) } } return fmt.Errorf("%s: %w", operation, err) }