Reticulum-Go/pkg/librns/errors.go

89 lines
2 KiB
Go

// SPDX-License-Identifier: Apache-2.0
// Copyright (c) 2024-2026 Quad4.io
package librns
import (
"context"
"errors"
"sync"
"quad4/reticulum-go/pkg/common"
)
// Error codes returned across the librns API.
const (
OK = 0
ErrInvalidArg = 1
ErrInvalidHandle = 2
ErrNotFound = 3
ErrState = 4
ErrIO = 5
ErrInternal = 6
ErrTimeout = 7
ErrTruncated = 8
)
var (
lastErrMu sync.RWMutex
lastErr string
)
func setLastError(err error) int {
if err == nil {
lastErrMu.Lock()
lastErr = ""
lastErrMu.Unlock()
return OK
}
lastErrMu.Lock()
lastErr = err.Error()
lastErrMu.Unlock()
return mapError(err)
}
func mapError(err error) int {
if err == nil {
return OK
}
switch {
case errors.Is(err, errInvalidHandle):
return ErrInvalidHandle
case errors.Is(err, errInvalidArg):
return ErrInvalidArg
case errors.Is(err, errNotFound):
return ErrNotFound
case errors.Is(err, errState):
return ErrState
case errors.Is(err, errTimeout):
return ErrTimeout
case errors.Is(err, context.DeadlineExceeded), errors.Is(err, context.Canceled):
return ErrTimeout
case errors.Is(err, errIO):
return ErrIO
case errors.Is(err, common.ErrPathRequestThrottled),
errors.Is(err, common.ErrDestAnnounceThrottled),
errors.Is(err, common.ErrLinkRequestBusy),
errors.Is(err, common.ErrLinkRequestDuplicate),
errors.Is(err, common.ErrLinkNotActive),
errors.Is(err, common.ErrLinkEstablishBusy),
errors.Is(err, common.ErrLinkAlreadySettled):
return ErrState
case errors.Is(err, common.ErrLinkNoPath),
errors.Is(err, common.ErrNoPathToDestination),
errors.Is(err, common.ErrTransportNoPathForLinkRelay),
errors.Is(err, common.ErrIdentityNotFound):
return ErrNotFound
case errors.Is(err, errInternal):
return ErrInternal
default:
return ErrInternal
}
}
// LastError returns the message for the most recent failing librns call.
func LastError() string {
lastErrMu.RLock()
defer lastErrMu.RUnlock()
return lastErr
}