Files
dolt/go/store/atomicerr/atomic_error.go

72 lines
1.3 KiB
Go

// Copyright 2019 Dolthub, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package atomicerr
import (
"sync"
"sync/atomic"
)
type AtomicError struct {
once *sync.Once
val *atomic.Value
}
func New() *AtomicError {
return &AtomicError{&sync.Once{}, &atomic.Value{}}
}
func (ae *AtomicError) SetIfError(err error) bool {
if err != nil {
ae.once.Do(func() {
ae.val.Store(err)
})
return true
}
return false
}
func (ae *AtomicError) SetIfErrAndCheck(err error) bool {
ae.SetIfError(err)
return ae.IsSet()
}
func (ae *AtomicError) IsSet() bool {
val := ae.val.Load()
return val != nil
}
func (ae *AtomicError) Get() error {
val := ae.val.Load()
if val == nil {
return nil
}
return val.(error)
}
func (ae *AtomicError) Error() string {
err := ae.Get()
if err != nil {
return err.Error()
}
return ""
}