00d233bca5
Change-Id: I0fa583140ab14448c26c602838aa035d8372b965
63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
// Copyright (C) 2023 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
package satellitedb
|
|
|
|
import (
|
|
"github.com/zeebo/errs"
|
|
|
|
"storj.io/private/tagsql"
|
|
)
|
|
|
|
// withRows ensures that rows get properly closed after the callback finishes.
|
|
func withRows(rows tagsql.Rows, err error) func(func(tagsql.Rows) error) error {
|
|
return func(callback func(tagsql.Rows) error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err := callback(rows)
|
|
return errs.Combine(rows.Err(), rows.Close(), err)
|
|
}
|
|
}
|
|
|
|
// convertSlice converts xs by applying fn to each element.
|
|
// If there's an error during conversion, the function
|
|
// returns an empty slice and the error.
|
|
func convertSlice[In, Out any](xs []In, fn func(In) (Out, error)) ([]Out, error) {
|
|
rs := make([]Out, len(xs))
|
|
for i := range xs {
|
|
var err error
|
|
rs[i], err = fn(xs[i])
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
return rs, nil
|
|
}
|
|
|
|
// convertSliceNoError converts xs by applying fn to each element.
|
|
func convertSliceNoError[In, Out any](xs []In, fn func(In) Out) []Out {
|
|
rs := make([]Out, len(xs))
|
|
for i := range xs {
|
|
rs[i] = fn(xs[i])
|
|
}
|
|
return rs
|
|
}
|
|
|
|
// convertSliceWithErrors converts xs by applying fn to each element.
|
|
// It returns all the successfully converted values and returns the list of
|
|
// errors separately.
|
|
func convertSliceWithErrors[In, Out any](xs []In, fn func(In) (Out, error)) ([]Out, []error) {
|
|
var errs []error
|
|
rs := make([]Out, 0, len(xs))
|
|
for i := range xs {
|
|
r, err := fn(xs[i])
|
|
if err != nil {
|
|
errs = append(errs, err)
|
|
continue
|
|
}
|
|
rs = append(rs, r)
|
|
}
|
|
return rs, errs
|
|
}
|