mirror of
https://github.com/Quad4-Software/Reticulum-Go
synced 2026-08-29 23:48:44 -04:00
89 lines
2 KiB
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
|
|
}
|