update toml
All checks were successful
Go Action / goaction (push) Successful in 28s
Go Action / goaction (pull_request) Successful in 26s

This commit is contained in:
2025-12-27 10:50:32 +03:00
parent cc252cc858
commit 90f6f65c5f
6 changed files with 94 additions and 83 deletions

28
.gitea/workflows/toml.yml Normal file
View File

@@ -0,0 +1,28 @@
name: Go Action
on: [push, pull_request]
jobs:
goaction:
runs-on: ubuntu-latest # Use a Gitea Actions runner label
steps:
- name: Check out repository code
uses: actions/checkout@v4 # Action to clone the repo
- name: Set up Go
uses: actions/setup-go@v5 # Action to install a specific Go version
with:
go-version: '1.25.5' # Specify your required Go version
- name: Run golangci-lint
uses: golangci/golangci-lint-action@v8 # Use the golangci-lint action
with:
version: v2.7.2 # Specify the linter version
# Optional: additional arguments
args: --verbose
working-directory: ./provider/json
- name: Run go test
run: go test ./...
working-directory: ./provider/json

View File

@@ -1,8 +1,8 @@
module gitoa.ru/go-4devs/config/provider/toml
go 1.22
go 1.23
require (
github.com/pelletier/go-toml v1.9.5
gitoa.ru/go-4devs/config v0.0.1
github.com/pelletier/go-toml/v2 v2.2.4
gitoa.ru/go-4devs/config v0.0.5
)

View File

@@ -1,4 +1,6 @@
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
gitoa.ru/go-4devs/config v0.0.1 h1:9KrOO09YbIMO8qL8aVn/G74DurGdOIW5y3O02bays4I=
gitoa.ru/go-4devs/config v0.0.1/go.mod h1:xfEC2Al9xnMLJUuekYs3KhJ5BIzWAseNwkMwbN6/xss=
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
gitoa.ru/go-4devs/config v0.0.4 h1:mTD0w34PcmVHWaOr/4+zkhYSvcuHiJaBa/bJBuUHcLI=
gitoa.ru/go-4devs/config v0.0.4/go.mod h1:UINWnObZA0nLiJro+TtavUBBvN0cSt17aRHOk20pP74=
gitoa.ru/go-4devs/config v0.0.5 h1:9GnQ1G6ebpkXe1tAeb3va/GIx7eBrMuJBYra47OXl+w=
gitoa.ru/go-4devs/config v0.0.5/go.mod h1:UINWnObZA0nLiJro+TtavUBBvN0cSt17aRHOk20pP74=

View File

@@ -2,10 +2,10 @@ package toml
import (
"context"
"encoding/json"
"fmt"
"strings"
"github.com/pelletier/go-toml"
toml "github.com/pelletier/go-toml/v2"
"gitoa.ru/go-4devs/config"
"gitoa.ru/go-4devs/config/value"
)
@@ -17,23 +17,22 @@ const (
var _ config.Provider = (*Provider)(nil)
func NewFile(file string, opts ...Option) (*Provider, error) {
tree, err := toml.LoadFile(file)
if err != nil {
return nil, fmt.Errorf("toml: failed load file: %w", err)
}
return configure(tree, opts...), nil
}
type Option func(*Provider)
func configure(tree *toml.Tree, opts ...Option) *Provider {
func WithName(in string) Option {
return func(p *Provider) {
p.name = in
}
}
func New(in []byte, opts ...Option) (*Provider, error) {
var data Data
if err := toml.Unmarshal(in, &data); err != nil {
return nil, fmt.Errorf("toml failed load data: %w", err)
}
prov := &Provider{
tree: tree,
key: func(s []string) string {
return strings.Join(s, Separator)
},
data: data,
name: Name,
}
@@ -41,21 +40,11 @@ func configure(tree *toml.Tree, opts ...Option) *Provider {
opt(prov)
}
return prov
}
func New(data []byte, opts ...Option) (*Provider, error) {
tree, err := toml.LoadBytes(data)
if err != nil {
return nil, fmt.Errorf("toml failed load data: %w", err)
}
return configure(tree, opts...), nil
return prov, nil
}
type Provider struct {
tree *toml.Tree
key func([]string) string
data Data
name string
}
@@ -64,9 +53,39 @@ func (p *Provider) Name() string {
}
func (p *Provider) Value(_ context.Context, path ...string) (config.Value, error) {
if k := p.key(path); p.tree.Has(k) {
return Value{Value: value.Value{Val: p.tree.Get(k)}}, nil
val, err := p.data.Value(path...)
if err != nil {
return nil, fmt.Errorf("%w", err)
}
return nil, config.ErrValueNotFound
data, merr := json.Marshal(val)
if merr != nil {
return nil, fmt.Errorf("toml:%w", merr)
}
return value.JBytes(data), nil
}
type Data map[string]any
func (d Data) Value(path ...string) (any, error) {
if len(path) == 1 {
val, ok := d[path[0]]
if !ok {
return "", config.ErrValueNotFound
}
return val, nil
}
key, path := path[0], path[1:]
val, ok := d[key]
if !ok {
return nil, config.ErrValueNotFound
}
data, _ := val.(map[string]any)
return Data(data).Value(path...)
}

View File

@@ -4,6 +4,7 @@ import (
"embed"
"testing"
"gitoa.ru/go-4devs/config"
"gitoa.ru/go-4devs/config/provider/toml"
"gitoa.ru/go-4devs/config/test"
"gitoa.ru/go-4devs/config/test/require"
@@ -24,12 +25,14 @@ func TestProvider(t *testing.T) {
m := []int{}
read := []test.Read{
test.NewRead("192.168.1.1", "database.server"),
test.NewRead("192.168.1.1", "database", "server"),
test.NewRead("TOML Example", "title"),
test.NewRead("10.0.0.1", "servers.alpha.ip"),
test.NewRead(true, "database.enabled"),
test.NewRead(5000, "database.connection_max"),
test.NewRead("10.0.0.1", "servers", "alpha", "ip"),
test.NewRead(true, "database", "enabled"),
test.NewRead(5000, "database", "connection_max"),
test.NewReadUnmarshal(&[]int{8001, 8001, 8002}, &m, "database", "ports"),
test.NewErrorIs(config.ErrValueNotFound, "typo"),
test.NewErrorIs(config.ErrValueNotFound, "database.server"),
}
test.Run(t, prov, read)

View File

@@ -1,41 +0,0 @@
package toml
import (
"encoding/json"
"fmt"
"gitoa.ru/go-4devs/config"
"gitoa.ru/go-4devs/config/value"
)
type Value struct {
value.Value
}
func (s Value) Int() int {
v, _ := s.ParseInt()
return v
}
func (s Value) ParseInt() (int, error) {
v, err := s.ParseInt64()
if err != nil {
return 0, fmt.Errorf("toml failed parce int: %w", err)
}
return int(v), nil
}
func (s Value) Unmarshal(target any) error {
b, err := json.Marshal(s.Raw())
if err != nil {
return fmt.Errorf("%w: %w", config.ErrInvalidValue, err)
}
if err := json.Unmarshal(b, target); err != nil {
return fmt.Errorf("%w: %w", config.ErrInvalidValue, err)
}
return nil
}