Compare commits

..

3 Commits

Author SHA1 Message Date
1fdc1fc456 add jx example
Some checks are pending
Lint / golangci-lint (push) Waiting to run
Declarative Tests / test (push) Waiting to run
Declarative Tests / build-fedora (push) Waiting to run
Declarative Tests / build-ubuntu-focal (push) Waiting to run
2024-09-23 17:03:20 +00:00
4eb3a9d2a7 add system config type 2024-09-19 17:56:17 +00:00
01933df053 add Close to the reader 2024-09-19 08:18:48 +00:00
5 changed files with 137 additions and 4 deletions

View File

@ -10,7 +10,34 @@ These tools work with YAML descriptions of resources (E.g. files, users, contain
# Releases
v0 releases are unstable and changes may be made to interfaces and specifications.
**v0 releases are unstable and changes may be made to interfaces and specifications.**
# JX Documents
The JX YAML specification is a simple way to describe system resources. The two main components are `configurations` and `resources`.
## Configurations
`
configurations:
- name: myhttpconfig
values:
http_user: jex
http_password: sample
- name: myhttptoken
values:
authorization_token: abcde123456789
`
## Resources
`
resources:
- type: http
config: myhttptoken
transition: read
attributes:
endpoint: https://myserver/v1/api
`
# Testing

81
internal/config/system.go Normal file
View File

@ -0,0 +1,81 @@
// Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved.
package config
import (
"context"
"encoding/json"
"net/url"
"fmt"
"decl/internal/data"
"decl/internal/folio"
"runtime"
)
// Collects facts about the system
var (
buildValues = map[string]any{
"GOOS": runtime.GOOS,
"GOARCH": runtime.GOARCH,
}
)
func init() {
folio.DocumentRegistry.ConfigurationTypes.Register([]string{"system"}, func(u *url.URL) data.Configuration {
s := NewSystem()
return s
})
}
type System Generic[any]
func NewSystem() *System {
s := make(System)
for k, v := range buildValues {
s[k] = v
}
return &s
}
func (s *System) URI() string {
return fmt.Sprintf("%s://%s", s.Type(), "")
}
func (s *System) SetURI(uri string) error {
return nil
}
func (s *System) SetParsedURI(uri *url.URL) error {
return nil
}
func (s *System) Clone() data.Configuration {
jsonSystem, _ := json.Marshal(s)
clone := NewSystem()
if unmarshalErr := json.Unmarshal(jsonSystem, clone); unmarshalErr != nil {
panic(unmarshalErr)
}
return clone
}
func (s *System) Has(key string) (ok bool) {
_, ok = (*s)[key]
return
}
func (s *System) Type() string {
return "system"
}
func (s *System) Read(context.Context) ([]byte, error) {
return nil, nil
}
func (s *System) GetValue(name string) (result any, err error) {
var ok bool
if result, ok = (*s)[name]; !ok {
err = ErrUnknownConfigurationKey
}
return
}

View File

@ -0,0 +1,20 @@
// Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved.
package config
import (
"github.com/stretchr/testify/assert"
"testing"
)
func TestNewSystemConfig(t *testing.T) {
s := NewSystem()
assert.NotNil(t, s)
}
func TestSystemConfig(t *testing.T) {
s := NewSystem()
assert.NotNil(t, s)
assert.True(t, s.Has("GOARCH"))
}

View File

@ -10,11 +10,11 @@ import (
type ReadFilter func([]byte, int, error) (int, error)
type Reader struct {
input io.Reader
input io.ReadCloser
filter ReadFilter
}
func NewReader(reader io.Reader, filter ReadFilter) *Reader {
func NewReader(reader io.ReadCloser, filter ReadFilter) *Reader {
return &Reader{
input: reader,
filter: filter,
@ -30,3 +30,7 @@ func (r *Reader) Read(p []byte) (n int, err error) {
}
return n, err
}
func (r *Reader) Close() error {
return r.input.Close()
}

View File

@ -6,11 +6,12 @@ import (
"github.com/stretchr/testify/assert"
"testing"
"strings"
"io"
)
func TestNewReader(t *testing.T) {
buffer := make([]byte, 20)
reader := NewReader(strings.NewReader("testdata"), func(p []byte, in int, e error) (int, error) {
reader := NewReader(io.NopCloser(strings.NewReader("testdata")), func(p []byte, in int, e error) (int, error) {
copy(p, []byte("foo"))
return 3, nil
})