From 91048c16f86b66a5418ef651cdf8a4c6b2b50aec Mon Sep 17 00:00:00 2001 From: Stavros Date: Thu, 11 Sep 2025 23:10:36 +0300 Subject: [PATCH] feat: add flag decoder (candidate) --- internal/config/config.go | 10 ++++ internal/utils/decoders/flags_decoder.go | 55 +++++++++++++++++ internal/utils/decoders/flags_decoder_test.go | 60 +++++++++++++++++++ internal/utils/decoders/label_decoder_test.go | 13 ++-- 4 files changed, 129 insertions(+), 9 deletions(-) create mode 100644 internal/utils/decoders/flags_decoder.go create mode 100644 internal/utils/decoders/flags_decoder_test.go diff --git a/internal/config/config.go b/internal/config/config.go index 7ccedd3..6b143bf 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -174,3 +174,13 @@ type AppPath struct { Allow string Block string } + +// Flags + +type Providers struct { + Providers map[string]ProviderConfig +} + +type ProviderConfig struct { + Config OAuthServiceConfig +} diff --git a/internal/utils/decoders/flags_decoder.go b/internal/utils/decoders/flags_decoder.go new file mode 100644 index 0000000..4154157 --- /dev/null +++ b/internal/utils/decoders/flags_decoder.go @@ -0,0 +1,55 @@ +package decoders + +import ( + "strings" + "tinyauth/internal/config" + "tinyauth/internal/utils" + + "github.com/traefik/paerser/parser" +) + +func DecodeFlags(flags map[string]string) (config.Providers, error) { + // Normalize flags (sorry to whoever has to read this) + // --providers-client1-client-id -> tinyauth.providers.client1.clientId + normalized := make(map[string]string) + for k, v := range flags { + newKey := "" + + nk := strings.TrimPrefix(k, "--") + parts := strings.SplitN(nk, "-", 4) + + for i, part := range parts { + if i == 3 { + subParts := strings.Split(part, "-") + for j, subPart := range subParts { + if j == 0 { + newKey += "." + subPart + } else { + newKey += utils.Capitalize(subPart) + } + } + continue + } + if i == 0 { + newKey += part + continue + } + newKey += "." + part + } + + newKey = "tinyauth." + newKey + normalized[newKey] = v + + } + + // Decode + var providers config.Providers + + err := parser.Decode(normalized, &providers, "tinyauth", "tinyauth.providers") + + if err != nil { + return config.Providers{}, err + } + + return providers, nil +} diff --git a/internal/utils/decoders/flags_decoder_test.go b/internal/utils/decoders/flags_decoder_test.go new file mode 100644 index 0000000..a10760a --- /dev/null +++ b/internal/utils/decoders/flags_decoder_test.go @@ -0,0 +1,60 @@ +package decoders_test + +import ( + "testing" + "tinyauth/internal/config" + "tinyauth/internal/utils/decoders" + + "gotest.tools/v3/assert" +) + +func TestDecodeFlags(t *testing.T) { + // Variables + expected := config.Providers{ + Providers: map[string]config.ProviderConfig{ + "client1": { + Config: config.OAuthServiceConfig{ + ClientID: "client1-id", + ClientSecret: "client1-secret", + Scopes: []string{"client1-scope1", "client1-scope2"}, + RedirectURL: "client1-redirect-url", + AuthURL: "client1-auth-url", + UserinfoURL: "client1-user-info-url", + InsecureSkipVerify: false, + }, + }, + "client2": { + Config: config.OAuthServiceConfig{ + ClientID: "client2-id", + ClientSecret: "client2-secret", + Scopes: []string{"client2-scope1", "client2-scope2"}, + RedirectURL: "client2-redirect-url", + AuthURL: "client2-auth-url", + UserinfoURL: "client2-user-info-url", + InsecureSkipVerify: false, + }, + }, + }, + } + test := map[string]string{ + "--providers-client1-config-client-id": "client1-id", + "--providers-client1-config-client-secret": "client1-secret", + "--providers-client1-config-scopes": "client1-scope1,client1-scope2", + "--providers-client1-config-redirect-url": "client1-redirect-url", + "--providers-client1-config-auth-url": "client1-auth-url", + "--providers-client1-config-user-info-url": "client1-user-info-url", + "--providers-client1-config-insecure-skip-verify": "false", + "--providers-client2-config-client-id": "client2-id", + "--providers-client2-config-client-secret": "client2-secret", + "--providers-client2-config-scopes": "client2-scope1,client2-scope2", + "--providers-client2-config-redirect-url": "client2-redirect-url", + "--providers-client2-config-auth-url": "client2-auth-url", + "--providers-client2-config-user-info-url": "client2-user-info-url", + "--providers-client2-config-insecure-skip-verify": "false", + } + + // Test + res, err := decoders.DecodeFlags(test) + assert.NilError(t, err) + assert.DeepEqual(t, expected, res) +} diff --git a/internal/utils/decoders/label_decoder_test.go b/internal/utils/decoders/label_decoder_test.go index 1df885c..63189d1 100644 --- a/internal/utils/decoders/label_decoder_test.go +++ b/internal/utils/decoders/label_decoder_test.go @@ -1,10 +1,11 @@ package decoders_test import ( - "reflect" "testing" "tinyauth/internal/config" "tinyauth/internal/utils/decoders" + + "gotest.tools/v3/assert" ) func TestDecodeLabels(t *testing.T) { @@ -62,12 +63,6 @@ func TestDecodeLabels(t *testing.T) { // Test result, err := decoders.DecodeLabels(test) - - if err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - if reflect.DeepEqual(expected, result) == false { - t.Fatalf("Expected %v but got %v", expected, result) - } + assert.NilError(t, err) + assert.DeepEqual(t, expected, result) }