diff --git a/config.example.yaml b/config.example.yaml
index 86f2b7c..b9f0a81 100644
--- a/config.example.yaml
+++ b/config.example.yaml
@@ -12,7 +12,7 @@ llm:
url: "http://localhost:8081/v1"
key: ${ODIDERE_LLM_KEY}
model: "default"
- system_prompt: "You are a helpful voice assistant. Be concise."
+ system_message: "You are a helpful voice assistant. Be concise."
timeout: "5m"
tts:
diff --git a/internal/llm/llm.go b/internal/llm/llm.go
index 5985cf7..bd685dc 100644
--- a/internal/llm/llm.go
+++ b/internal/llm/llm.go
@@ -22,8 +22,8 @@ type Config struct {
Key string `yaml:"key"`
// Model is the model identifier.
Model string `yaml:"model"`
- // SystemPrompt is prepended to all conversations.
- SystemPrompt string `yaml:"system_prompt"`
+ // SystemMessage is prepended to all conversations.
+ SystemMessage string `yaml:"system_message"`
// Timeout is the maximum duration for a query (e.g., "5m").
// Defaults to 5 minutes if empty.
Timeout string `yaml:"timeout"`
@@ -49,13 +49,13 @@ func (cfg Config) Validate() error {
// Client wraps an OpenAI-compatible client with tool execution support.
type Client struct {
- client *openai.Client
- log *slog.Logger
- model string
- registry *tool.Registry
- systemPrompt string
- timeout time.Duration
- tools []openai.Tool
+ client *openai.Client
+ log *slog.Logger
+ model string
+ registry *tool.Registry
+ systemMessage string
+ timeout time.Duration
+ tools []openai.Tool
}
// NewClient creates a new LLM client with the provided configuration.
@@ -70,10 +70,10 @@ func NewClient(
}
llm := &Client{
- log: log,
- model: cfg.Model,
- systemPrompt: cfg.SystemPrompt,
- registry: registry,
+ log: log,
+ model: cfg.Model,
+ systemMessage: cfg.SystemMessage,
+ registry: registry,
}
if cfg.Timeout == "" {
@@ -122,12 +122,14 @@ func (c *Client) DefaultModel() string {
// Query sends messages to the LLM using the specified model.
// If model is empty, uses the default configured model.
+// If systemMessage is non-empty, it overrides the configured system message.
// Returns all messages generated during the query, including tool calls
// and tool results. The final message is the last element in the slice.
func (c *Client) Query(
ctx context.Context,
messages []openai.ChatCompletionMessage,
model string,
+ systemMessage string,
) ([]openai.ChatCompletionMessage, error) {
ctx, cancel := context.WithTimeout(ctx, c.timeout)
defer cancel()
@@ -137,13 +139,19 @@ func (c *Client) Query(
model = c.model
}
- // Prepend system prompt, if configured and not already present.
- if c.systemPrompt != "" && (len(messages) == 0 ||
+ // Use per-request system message if provided, otherwise fall back to config.
+ effectiveMessage := c.systemMessage
+ if systemMessage != "" {
+ effectiveMessage = systemMessage
+ }
+
+ // Prepend system message, if configured and not already present.
+ if effectiveMessage != "" && (len(messages) == 0 ||
messages[0].Role != openai.ChatMessageRoleSystem) {
messages = append(
[]openai.ChatCompletionMessage{{
Role: openai.ChatMessageRoleSystem,
- Content: c.systemPrompt,
+ Content: effectiveMessage,
}},
messages...,
)
@@ -239,11 +247,13 @@ type StreamEvent struct {
// streams results. Each complete message (assistant reply, tool call,
// tool result) is sent to the events channel as it becomes available.
// The channel is closed before returning.
+// If systemMessage is non-empty, it overrides the configured system message.
// Returns all messages generated during the query.
func (c *Client) QueryStream(
ctx context.Context,
messages []openai.ChatCompletionMessage,
model string,
+ systemMessage string,
events chan<- StreamEvent,
) error {
defer close(events)
@@ -256,13 +266,19 @@ func (c *Client) QueryStream(
model = c.model
}
- // Prepend system prompt, if configured and not already present.
- if c.systemPrompt != "" && (len(messages) == 0 ||
+ // Use per-request system message if provided, otherwise fall back to config.
+ effectiveMessage := c.systemMessage
+ if systemMessage != "" {
+ effectiveMessage = systemMessage
+ }
+
+ // Prepend system message, if configured and not already present.
+ if effectiveMessage != "" && (len(messages) == 0 ||
messages[0].Role != openai.ChatMessageRoleSystem) {
messages = append(
[]openai.ChatCompletionMessage{{
Role: openai.ChatMessageRoleSystem,
- Content: c.systemPrompt,
+ Content: effectiveMessage,
}},
messages...,
)
diff --git a/internal/llm/llm_test.go b/internal/llm/llm_test.go
index 967d0b8..b3652bc 100644
--- a/internal/llm/llm_test.go
+++ b/internal/llm/llm_test.go
@@ -67,11 +67,11 @@ func TestConfigValidate(t *testing.T) {
{
name: "valid full config",
cfg: Config{
- Key: "sk-test-key",
- Model: "test-model",
- SystemPrompt: "You are a helpful assistant.",
- Timeout: "30m",
- URL: "http://localhost:8080",
+ Key: "sk-test-key",
+ Model: "test-model",
+ SystemMessage: "You are a helpful assistant.",
+ Timeout: "30m",
+ URL: "http://localhost:8080",
},
wantErr: false,
},
@@ -121,11 +121,11 @@ func TestNewClient(t *testing.T) {
{
name: "valid config with all fields",
cfg: Config{
- Key: "test-key",
- Model: "test-model",
- SystemPrompt: "Test prompt",
- Timeout: "5m",
- URL: "http://localhost:8080",
+ Key: "test-key",
+ Model: "test-model",
+ SystemMessage: "Test message",
+ Timeout: "5m",
+ URL: "http://localhost:8080",
},
wantErr: false,
},
diff --git a/internal/service/service.go b/internal/service/service.go
index 2ba11be..eb68192 100644
--- a/internal/service/service.go
+++ b/internal/service/service.go
@@ -311,6 +311,8 @@ type Request struct {
Messages []openai.ChatCompletionMessage `json:"messages"`
// Model is the LLM model ID. If empty, the default model is used.
Model string `json:"model,omitempty"`
+ // SystemMessage overrides the configured system message for this request.
+ SystemMessage string `json:"system_message,omitempty"`
// Voice is the voice ID for TTS.
Voice string `json:"voice,omitempty"`
}
@@ -455,7 +457,7 @@ func (svc *Service) voice(w http.ResponseWriter, r *http.Request) {
if model == "" {
model = svc.llm.DefaultModel()
}
- msgs, err := svc.llm.Query(ctx, messages, model)
+ msgs, err := svc.llm.Query(ctx, messages, model, req.SystemMessage)
if err != nil {
log.ErrorContext(
ctx,
@@ -731,7 +733,7 @@ func (svc *Service) voiceStream(w http.ResponseWriter, r *http.Request) {
llmErr error
)
go func() {
- llmErr = svc.llm.QueryStream(ctx, messages, model, events)
+ llmErr = svc.llm.QueryStream(ctx, messages, model, req.SystemMessage, events)
}()
// Consume events and send as SSE.
diff --git a/internal/service/static/icons.svg b/internal/service/static/icons.svg
index 58f1447..14845f1 100644
--- a/internal/service/static/icons.svg
+++ b/internal/service/static/icons.svg
@@ -90,4 +90,9 @@
+
+
+
+
+
diff --git a/internal/service/static/main.css b/internal/service/static/main.css
index adc846f..db655a8 100644
--- a/internal/service/static/main.css
+++ b/internal/service/static/main.css
@@ -593,6 +593,201 @@ body {
color: var(--color-text-muted);
}
+/* ==================== */
+/* Settings Modal */
+/* ==================== */
+
+.settings-overlay {
+ display: none;
+ position: fixed;
+ inset: 0;
+ background: rgba(0, 0, 0, 0.5);
+ z-index: 1000;
+ align-items: center;
+ justify-content: center;
+ padding: var(--s1);
+}
+
+.settings-overlay.open {
+ display: flex;
+}
+
+.settings-panel {
+ background: var(--color-surface);
+ border: 1px solid var(--color-border-light);
+ border-radius: var(--radius);
+ width: 100%;
+ max-width: 480px;
+ max-height: 90vh;
+ overflow-y: auto;
+ padding: var(--s1);
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.15);
+}
+
+.settings-panel__header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: var(--s1);
+}
+
+.settings-panel__title {
+ font-size: var(--s1);
+ font-weight: 600;
+ color: var(--color-text);
+ margin: 0;
+}
+
+/* Close button: remove toolbar border, darken the X. */
+#settings-close {
+ border: none;
+ color: var(--color-text);
+}
+
+@media (hover: hover) {
+ #settings-close:hover {
+ border-color: transparent;
+ color: var(--color-text);
+ }
+}
+
+/* Tabs */
+.settings-tabs {
+ display: flex;
+ border-bottom: 2px solid var(--color-border-light);
+ margin-bottom: var(--s1);
+}
+
+.settings-tab {
+ padding: var(--s-2) var(--s-1);
+ background: transparent;
+ border: none;
+ border-bottom: 2px solid transparent;
+ margin-bottom: -2px;
+ font-family: inherit;
+ font-size: var(--s-1);
+ color: var(--color-text-muted);
+ cursor: pointer;
+ transition: all 0.15s ease;
+}
+
+@media (hover: hover) {
+ .settings-tab:hover {
+ color: var(--color-text);
+ }
+}
+
+.settings-tab:focus-visible {
+ outline: 2px solid var(--color-primary);
+ outline-offset: -2px;
+}
+
+.settings-tab.active {
+ color: var(--color-text);
+ border-bottom-color: var(--color-primary);
+ font-weight: 500;
+}
+
+/* Tab panels */
+.settings-tab-panel {
+ display: none;
+}
+
+.settings-tab-panel.active {
+ display: block;
+}
+
+.settings-label {
+ display: block;
+ font-size: var(--s-1);
+ font-weight: 500;
+ color: var(--color-text);
+ margin-bottom: var(--s-2);
+}
+
+.settings-select {
+ width: 100%;
+ height: var(--s2);
+ padding: 0 var(--s-1);
+ font-family: inherit;
+ font-size: var(--s-1);
+ line-height: var(--s2);
+ color: var(--color-text);
+ background: var(--color-surface);
+ border: 1px solid var(--color-border-light);
+ border-radius: var(--radius);
+ cursor: pointer;
+ margin-bottom: var(--s1);
+}
+
+.settings-select:focus-visible {
+ outline: 2px solid var(--color-primary);
+ outline-offset: 2px;
+}
+
+.settings-textarea {
+ display: block;
+ width: 100%;
+ min-height: calc(var(--s2) * 6);
+ padding: var(--s-1);
+ font-family: var(--font-mono);
+ font-size: var(--s-1);
+ line-height: 1.5;
+ color: var(--color-text);
+ background: var(--color-bg);
+ border: 1px solid var(--color-border-light);
+ border-radius: var(--radius);
+ resize: vertical;
+ margin-bottom: var(--s-1);
+}
+
+.settings-textarea:focus {
+ outline: 2px solid var(--color-primary);
+ outline-offset: 1px;
+}
+
+.settings-save-row {
+ display: flex;
+ justify-content: flex-end;
+}
+
+.settings-save-btn {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: var(--s-2) var(--s-1);
+ font-family: inherit;
+ font-size: var(--s-1);
+ font-weight: 500;
+ color: white;
+ background: var(--color-primary);
+ border: none;
+ border-radius: var(--radius);
+ cursor: pointer;
+ transition: background-color 0.15s ease;
+ min-width: var(--s2);
+}
+
+@media (hover: hover) {
+ .settings-save-btn:hover {
+ background: var(--color-primary-hover);
+ }
+}
+
+.settings-save-btn:focus-visible {
+ outline: 2px solid var(--color-primary);
+ outline-offset: 2px;
+}
+
+.settings-save-btn--success {
+ background: var(--color-green);
+}
+
+.settings-save-btn .icon {
+ width: 1rem;
+ height: 1rem;
+}
+
/* ==================== */
/* Animations */
/* ==================== */
@@ -668,4 +863,16 @@ body {
max-width: 128px;
font-size: var(--s-1);
}
+
+ .settings-overlay {
+ padding: 0;
+ }
+
+ .settings-panel {
+ max-width: 100%;
+ max-height: 100dvh;
+ height: 100dvh;
+ border-radius: 0;
+ border: none;
+ }
}
diff --git a/internal/service/static/main.js b/internal/service/static/main.js
index 61a9309..7f583a8 100644
--- a/internal/service/static/main.js
+++ b/internal/service/static/main.js
@@ -3,6 +3,7 @@ const ICONS_URL = '/static/icons.svg';
const MODELS_ENDPOINT = '/v1/models';
const MODEL_KEY = 'odidere_model';
const STORAGE_KEY = 'odidere_history';
+const SYSTEM_MESSAGE_KEY = 'odidere_system_message';
const VOICES_ENDPOINT = '/v1/voices';
const VOICE_KEY = 'odidere_voice';
@@ -42,6 +43,15 @@ class Odidere {
this.$voice = document.getElementById('voice');
this.$mute = document.getElementById('mute');
+ // Settings modal
+ this.$settings = document.getElementById('settings');
+ this.$settingsOverlay = document.getElementById('settings-overlay');
+ this.$settingsClose = document.getElementById('settings-close');
+ this.$settingsTabs = document.querySelectorAll('.settings-tab');
+ this.$settingsPanels = document.querySelectorAll('.settings-tab-panel');
+ this.$systemMessageInput = document.getElementById('system-message-input');
+ this.$saveSystemMessage = document.getElementById('save-system-message');
+
// Templates
this.$tplAssistantMessage = document.getElementById(
'tpl-assistant-message',
@@ -151,6 +161,28 @@ class Odidere {
});
// Mute button
this.$mute.addEventListener('click', () => this.#toggleMute());
+
+ // Settings modal
+ this.$settings.addEventListener('click', () => this.openSettings());
+ this.$settingsClose.addEventListener('click', () => this.closeSettings());
+ this.$settingsOverlay.addEventListener('click', (e) => {
+ if (e.target === this.$settingsOverlay) this.closeSettings();
+ });
+ this.document.addEventListener('keydown', (e) => {
+ if (
+ e.key === 'Escape' &&
+ this.$settingsOverlay.classList.contains('open')
+ ) {
+ e.preventDefault();
+ this.closeSettings();
+ }
+ });
+ this.$settingsTabs.forEach(($tab) => {
+ $tab.addEventListener('click', () => this.#switchTab($tab.dataset.tab));
+ });
+ this.$saveSystemMessage.addEventListener('click', () =>
+ this.#saveSystemMessage(),
+ );
}
/**
@@ -557,6 +589,10 @@ class Odidere {
voice: this.$voice.value,
model: this.$model.value,
};
+ const systemMessage = localStorage.getItem(SYSTEM_MESSAGE_KEY);
+ if (systemMessage) {
+ payload.system_message = systemMessage;
+ }
if (audio) {
payload.audio = await this.#toBase64(audio);
}
@@ -674,7 +710,11 @@ class Odidere {
}
// Collect tool results and render once all have arrived.
- if (message.role === 'tool' && pendingTools && pendingTools.assistant) {
+ if (
+ message.role === 'tool' &&
+ pendingTools &&
+ pendingTools.assistant
+ ) {
pendingTools.results.push(message);
// Add to history (server needs it) but don't render yet.
this.#appendHistory([message]);
@@ -849,6 +889,67 @@ class Odidere {
}
}
+ /**
+ * openSettings opens the settings modal and loads current values.
+ */
+ openSettings() {
+ this.$settingsOverlay.classList.add('open');
+ this.#loadSystemMessage();
+ this.#switchTab('model-voice');
+ // Focus the close button for accessibility.
+ this.$settingsClose.focus();
+ }
+
+ /**
+ * closeSettings closes the settings modal and restores focus.
+ */
+ closeSettings() {
+ this.$settingsOverlay.classList.remove('open');
+ this.$settings.focus();
+ }
+
+ /**
+ * #switchTab switches the active tab in the settings modal.
+ * @param {string} tabName
+ */
+ #switchTab(tabName) {
+ this.$settingsTabs.forEach(($tab) => {
+ const isActive = $tab.dataset.tab === tabName;
+ $tab.classList.toggle('active', isActive);
+ $tab.setAttribute('aria-selected', String(isActive));
+ });
+ this.$settingsPanels.forEach(($panel) => {
+ const isActive = $panel.dataset.tabPanel === tabName;
+ $panel.classList.toggle('active', isActive);
+ $panel.hidden = !isActive;
+ });
+ }
+
+ /**
+ * #saveSystemMessage saves the textarea value to localStorage.
+ */
+ #saveSystemMessage() {
+ const value = this.$systemMessageInput.value;
+ localStorage.setItem(SYSTEM_MESSAGE_KEY, value);
+
+ // Brief visual feedback on the save button.
+ this.$saveSystemMessage.replaceChildren(this.#icon('check'));
+ this.$saveSystemMessage.classList.add('settings-save-btn--success');
+
+ setTimeout(() => {
+ this.$saveSystemMessage.textContent = 'Save';
+ this.$saveSystemMessage.classList.remove('settings-save-btn--success');
+ }, 1500);
+ }
+
+ /**
+ * #loadSystemMessage reads from localStorage and populates the textarea.
+ */
+ #loadSystemMessage() {
+ const stored = localStorage.getItem(SYSTEM_MESSAGE_KEY);
+ this.$systemMessageInput.value = stored || '';
+ }
+
// ====================
// RENDER: SELECTS
// ====================
diff --git a/internal/service/templates/static/body.gohtml b/internal/service/templates/static/body.gohtml
index 53223ed..9902bb4 100644
--- a/internal/service/templates/static/body.gohtml
+++ b/internal/service/templates/static/body.gohtml
@@ -2,5 +2,6 @@
{{ template "main" . }}
{{ template "templates" . }}
+ {{ template "modal/settings" . }}
{{ end }}
diff --git a/internal/service/templates/static/footer/toolbar.gohtml b/internal/service/templates/static/footer/toolbar.gohtml
index bf52962..f60c106 100644
--- a/internal/service/templates/static/footer/toolbar.gohtml
+++ b/internal/service/templates/static/footer/toolbar.gohtml
@@ -1,5 +1,14 @@
{{ define "footer/toolbar" }}
+{{ end }}
diff --git a/vendor/github.com/google/uuid/dce.go b/vendor/github.com/google/uuid/dce.go
index fa820b9..9302a1c 100644
--- a/vendor/github.com/google/uuid/dce.go
+++ b/vendor/github.com/google/uuid/dce.go
@@ -42,7 +42,7 @@ func NewDCESecurity(domain Domain, id uint32) (UUID, error) {
// NewDCEPerson returns a DCE Security (Version 2) UUID in the person
// domain with the id returned by os.Getuid.
//
-// NewDCESecurity(Person, uint32(os.Getuid()))
+// NewDCESecurity(Person, uint32(os.Getuid()))
func NewDCEPerson() (UUID, error) {
return NewDCESecurity(Person, uint32(os.Getuid()))
}
@@ -50,7 +50,7 @@ func NewDCEPerson() (UUID, error) {
// NewDCEGroup returns a DCE Security (Version 2) UUID in the group
// domain with the id returned by os.Getgid.
//
-// NewDCESecurity(Group, uint32(os.Getgid()))
+// NewDCESecurity(Group, uint32(os.Getgid()))
func NewDCEGroup() (UUID, error) {
return NewDCESecurity(Group, uint32(os.Getgid()))
}
diff --git a/vendor/github.com/google/uuid/hash.go b/vendor/github.com/google/uuid/hash.go
index dc60082..cee3757 100644
--- a/vendor/github.com/google/uuid/hash.go
+++ b/vendor/github.com/google/uuid/hash.go
@@ -45,7 +45,7 @@ func NewHash(h hash.Hash, space UUID, data []byte, version int) UUID {
// NewMD5 returns a new MD5 (Version 3) UUID based on the
// supplied name space and data. It is the same as calling:
//
-// NewHash(md5.New(), space, data, 3)
+// NewHash(md5.New(), space, data, 3)
func NewMD5(space UUID, data []byte) UUID {
return NewHash(md5.New(), space, data, 3)
}
@@ -53,7 +53,7 @@ func NewMD5(space UUID, data []byte) UUID {
// NewSHA1 returns a new SHA1 (Version 5) UUID based on the
// supplied name space and data. It is the same as calling:
//
-// NewHash(sha1.New(), space, data, 5)
+// NewHash(sha1.New(), space, data, 5)
func NewSHA1(space UUID, data []byte) UUID {
return NewHash(sha1.New(), space, data, 5)
}
diff --git a/vendor/github.com/google/uuid/node_js.go b/vendor/github.com/google/uuid/node_js.go
index b2a0bc8..f745d70 100644
--- a/vendor/github.com/google/uuid/node_js.go
+++ b/vendor/github.com/google/uuid/node_js.go
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+//go:build js
// +build js
package uuid
diff --git a/vendor/github.com/google/uuid/node_net.go b/vendor/github.com/google/uuid/node_net.go
index 0cbbcdd..e91358f 100644
--- a/vendor/github.com/google/uuid/node_net.go
+++ b/vendor/github.com/google/uuid/node_net.go
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+//go:build !js
// +build !js
package uuid
diff --git a/vendor/github.com/google/uuid/null.go b/vendor/github.com/google/uuid/null.go
index d7fcbf2..06ecf9d 100644
--- a/vendor/github.com/google/uuid/null.go
+++ b/vendor/github.com/google/uuid/null.go
@@ -17,15 +17,14 @@ var jsonNull = []byte("null")
// NullUUID implements the SQL driver.Scanner interface so
// it can be used as a scan destination:
//
-// var u uuid.NullUUID
-// err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&u)
-// ...
-// if u.Valid {
-// // use u.UUID
-// } else {
-// // NULL value
-// }
-//
+// var u uuid.NullUUID
+// err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&u)
+// ...
+// if u.Valid {
+// // use u.UUID
+// } else {
+// // NULL value
+// }
type NullUUID struct {
UUID UUID
Valid bool // Valid is true if UUID is not NULL
diff --git a/vendor/github.com/google/uuid/uuid.go b/vendor/github.com/google/uuid/uuid.go
index 5232b48..1051192 100644
--- a/vendor/github.com/google/uuid/uuid.go
+++ b/vendor/github.com/google/uuid/uuid.go
@@ -187,10 +187,12 @@ func Must(uuid UUID, err error) UUID {
}
// Validate returns an error if s is not a properly formatted UUID in one of the following formats:
-// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
-// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
-// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-// {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
+//
+// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
+// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
+// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+// {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
+//
// It returns an error if the format is invalid, otherwise nil.
func Validate(s string) error {
switch len(s) {
diff --git a/vendor/github.com/google/uuid/version4.go b/vendor/github.com/google/uuid/version4.go
index 7697802..62ac273 100644
--- a/vendor/github.com/google/uuid/version4.go
+++ b/vendor/github.com/google/uuid/version4.go
@@ -9,7 +9,7 @@ import "io"
// New creates a new random UUID or panics. New is equivalent to
// the expression
//
-// uuid.Must(uuid.NewRandom())
+// uuid.Must(uuid.NewRandom())
func New() UUID {
return Must(NewRandom())
}
@@ -17,7 +17,7 @@ func New() UUID {
// NewString creates a new random UUID and returns it as a string or panics.
// NewString is equivalent to the expression
//
-// uuid.New().String()
+// uuid.New().String()
func NewString() string {
return Must(NewRandom()).String()
}
@@ -31,11 +31,11 @@ func NewString() string {
//
// A note about uniqueness derived from the UUID Wikipedia entry:
//
-// Randomly generated UUIDs have 122 random bits. One's annual risk of being
-// hit by a meteorite is estimated to be one chance in 17 billion, that
-// means the probability is about 0.00000000006 (6 × 10−11),
-// equivalent to the odds of creating a few tens of trillions of UUIDs in a
-// year and having one duplicate.
+// Randomly generated UUIDs have 122 random bits. One's annual risk of being
+// hit by a meteorite is estimated to be one chance in 17 billion, that
+// means the probability is about 0.00000000006 (6 × 10−11),
+// equivalent to the odds of creating a few tens of trillions of UUIDs in a
+// year and having one duplicate.
func NewRandom() (UUID, error) {
if !poolEnabled {
return NewRandomFromReader(rander)
diff --git a/vendor/gopkg.in/yaml.v3/apic.go b/vendor/gopkg.in/yaml.v3/apic.go
index ae7d049..05fd305 100644
--- a/vendor/gopkg.in/yaml.v3/apic.go
+++ b/vendor/gopkg.in/yaml.v3/apic.go
@@ -1,17 +1,17 @@
-//
+//
// Copyright (c) 2011-2019 Canonical Ltd
// Copyright (c) 2006-2010 Kirill Simonov
-//
+//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
// of the Software, and to permit persons to whom the Software is furnished to do
// so, subject to the following conditions:
-//
+//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
-//
+//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
diff --git a/vendor/gopkg.in/yaml.v3/emitterc.go b/vendor/gopkg.in/yaml.v3/emitterc.go
index 0f47c9c..dde20e5 100644
--- a/vendor/gopkg.in/yaml.v3/emitterc.go
+++ b/vendor/gopkg.in/yaml.v3/emitterc.go
@@ -162,10 +162,9 @@ func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool {
// Check if we need to accumulate more events before emitting.
//
// We accumulate extra
-// - 1 event for DOCUMENT-START
-// - 2 events for SEQUENCE-START
-// - 3 events for MAPPING-START
-//
+// - 1 event for DOCUMENT-START
+// - 2 events for SEQUENCE-START
+// - 3 events for MAPPING-START
func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool {
if emitter.events_head == len(emitter.events) {
return true
@@ -241,7 +240,7 @@ func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool
emitter.indent += 2
} else {
// Everything else aligns to the chosen indentation.
- emitter.indent = emitter.best_indent*((emitter.indent+emitter.best_indent)/emitter.best_indent)
+ emitter.indent = emitter.best_indent * ((emitter.indent + emitter.best_indent) / emitter.best_indent)
}
}
return true
diff --git a/vendor/gopkg.in/yaml.v3/parserc.go b/vendor/gopkg.in/yaml.v3/parserc.go
index 268558a..25fe823 100644
--- a/vendor/gopkg.in/yaml.v3/parserc.go
+++ b/vendor/gopkg.in/yaml.v3/parserc.go
@@ -227,7 +227,8 @@ func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool
// Parse the production:
// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
-// ************
+//
+// ************
func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool {
token := peek_token(parser)
if token == nil {
@@ -249,9 +250,12 @@ func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t)
// Parse the productions:
// implicit_document ::= block_node DOCUMENT-END*
-// *
+//
+// *
+//
// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
-// *************************
+//
+// *************************
func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool {
token := peek_token(parser)
@@ -356,8 +360,8 @@ func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t
// Parse the productions:
// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
-// ***********
//
+// ***********
func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool {
token := peek_token(parser)
if token == nil {
@@ -379,9 +383,10 @@ func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event
// Parse the productions:
// implicit_document ::= block_node DOCUMENT-END*
-// *************
-// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
//
+// *************
+//
+// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool {
token := peek_token(parser)
if token == nil {
@@ -428,30 +433,41 @@ func yaml_parser_set_event_comments(parser *yaml_parser_t, event *yaml_event_t)
// Parse the productions:
// block_node_or_indentless_sequence ::=
-// ALIAS
-// *****
-// | properties (block_content | indentless_block_sequence)?
-// ********** *
-// | block_content | indentless_block_sequence
-// *
+//
+// ALIAS
+// *****
+// | properties (block_content | indentless_block_sequence)?
+// ********** *
+// | block_content | indentless_block_sequence
+// *
+//
// block_node ::= ALIAS
-// *****
-// | properties block_content?
-// ********** *
-// | block_content
-// *
+//
+// *****
+// | properties block_content?
+// ********** *
+// | block_content
+// *
+//
// flow_node ::= ALIAS
-// *****
-// | properties flow_content?
-// ********** *
-// | flow_content
-// *
+//
+// *****
+// | properties flow_content?
+// ********** *
+// | flow_content
+// *
+//
// properties ::= TAG ANCHOR? | ANCHOR TAG?
-// *************************
+//
+// *************************
+//
// block_content ::= block_collection | flow_collection | SCALAR
-// ******
+//
+// ******
+//
// flow_content ::= flow_collection | SCALAR
-// ******
+//
+// ******
func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool {
//defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)()
@@ -682,8 +698,8 @@ func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, i
// Parse the productions:
// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
-// ******************** *********** * *********
//
+// ******************** *********** * *********
func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
if first {
token := peek_token(parser)
@@ -740,7 +756,8 @@ func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_e
// Parse the productions:
// indentless_sequence ::= (BLOCK-ENTRY block_node?)+
-// *********** *
+//
+// *********** *
func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool {
token := peek_token(parser)
if token == nil {
@@ -805,14 +822,14 @@ func yaml_parser_split_stem_comment(parser *yaml_parser_t, stem_len int) {
// Parse the productions:
// block_mapping ::= BLOCK-MAPPING_START
-// *******************
-// ((KEY block_node_or_indentless_sequence?)?
-// *** *
-// (VALUE block_node_or_indentless_sequence?)?)*
//
-// BLOCK-END
-// *********
+// *******************
+// ((KEY block_node_or_indentless_sequence?)?
+// *** *
+// (VALUE block_node_or_indentless_sequence?)?)*
//
+// BLOCK-END
+// *********
func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
if first {
token := peek_token(parser)
@@ -881,13 +898,11 @@ func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_even
// Parse the productions:
// block_mapping ::= BLOCK-MAPPING_START
//
-// ((KEY block_node_or_indentless_sequence?)?
-//
-// (VALUE block_node_or_indentless_sequence?)?)*
-// ***** *
-// BLOCK-END
-//
+// ((KEY block_node_or_indentless_sequence?)?
//
+// (VALUE block_node_or_indentless_sequence?)?)*
+// ***** *
+// BLOCK-END
func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool {
token := peek_token(parser)
if token == nil {
@@ -915,16 +930,18 @@ func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_ev
// Parse the productions:
// flow_sequence ::= FLOW-SEQUENCE-START
-// *******************
-// (flow_sequence_entry FLOW-ENTRY)*
-// * **********
-// flow_sequence_entry?
-// *
-// FLOW-SEQUENCE-END
-// *****************
-// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
-// *
//
+// *******************
+// (flow_sequence_entry FLOW-ENTRY)*
+// * **********
+// flow_sequence_entry?
+// *
+// FLOW-SEQUENCE-END
+// *****************
+//
+// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+//
+// *
func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
if first {
token := peek_token(parser)
@@ -987,11 +1004,10 @@ func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_ev
return true
}
-//
// Parse the productions:
// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
-// *** *
//
+// *** *
func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool {
token := peek_token(parser)
if token == nil {
@@ -1011,8 +1027,8 @@ func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, ev
// Parse the productions:
// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
-// ***** *
//
+// ***** *
func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool {
token := peek_token(parser)
if token == nil {
@@ -1035,8 +1051,8 @@ func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t,
// Parse the productions:
// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
-// *
//
+// *
func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool {
token := peek_token(parser)
if token == nil {
@@ -1053,16 +1069,17 @@ func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, ev
// Parse the productions:
// flow_mapping ::= FLOW-MAPPING-START
-// ******************
-// (flow_mapping_entry FLOW-ENTRY)*
-// * **********
-// flow_mapping_entry?
-// ******************
-// FLOW-MAPPING-END
-// ****************
-// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
-// * *** *
//
+// ******************
+// (flow_mapping_entry FLOW-ENTRY)*
+// * **********
+// flow_mapping_entry?
+// ******************
+// FLOW-MAPPING-END
+// ****************
+//
+// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+// - *** *
func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
if first {
token := peek_token(parser)
@@ -1128,8 +1145,7 @@ func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event
// Parse the productions:
// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
-// * ***** *
-//
+// - ***** *
func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool {
token := peek_token(parser)
if token == nil {
diff --git a/vendor/gopkg.in/yaml.v3/readerc.go b/vendor/gopkg.in/yaml.v3/readerc.go
index b7de0a8..56af245 100644
--- a/vendor/gopkg.in/yaml.v3/readerc.go
+++ b/vendor/gopkg.in/yaml.v3/readerc.go
@@ -1,17 +1,17 @@
-//
+//
// Copyright (c) 2011-2019 Canonical Ltd
// Copyright (c) 2006-2010 Kirill Simonov
-//
+//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
// of the Software, and to permit persons to whom the Software is furnished to do
// so, subject to the following conditions:
-//
+//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
-//
+//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
diff --git a/vendor/gopkg.in/yaml.v3/scannerc.go b/vendor/gopkg.in/yaml.v3/scannerc.go
index ca00701..30b1f08 100644
--- a/vendor/gopkg.in/yaml.v3/scannerc.go
+++ b/vendor/gopkg.in/yaml.v3/scannerc.go
@@ -1614,11 +1614,11 @@ func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool {
// Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token.
//
// Scope:
-// %YAML 1.1 # a comment \n
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// %TAG !yaml! tag:yaml.org,2002: \n
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
+// %YAML 1.1 # a comment \n
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// %TAG !yaml! tag:yaml.org,2002: \n
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool {
// Eat '%'.
start_mark := parser.mark
@@ -1719,11 +1719,11 @@ func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool
// Scan the directive name.
//
// Scope:
-// %YAML 1.1 # a comment \n
-// ^^^^
-// %TAG !yaml! tag:yaml.org,2002: \n
-// ^^^
//
+// %YAML 1.1 # a comment \n
+// ^^^^
+// %TAG !yaml! tag:yaml.org,2002: \n
+// ^^^
func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool {
// Consume the directive name.
if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
@@ -1758,8 +1758,9 @@ func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark
// Scan the value of VERSION-DIRECTIVE.
//
// Scope:
-// %YAML 1.1 # a comment \n
-// ^^^^^^
+//
+// %YAML 1.1 # a comment \n
+// ^^^^^^
func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool {
// Eat whitespaces.
if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
@@ -1797,10 +1798,11 @@ const max_number_length = 2
// Scan the version number of VERSION-DIRECTIVE.
//
// Scope:
-// %YAML 1.1 # a comment \n
-// ^
-// %YAML 1.1 # a comment \n
-// ^
+//
+// %YAML 1.1 # a comment \n
+// ^
+// %YAML 1.1 # a comment \n
+// ^
func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool {
// Repeat while the next character is digit.
@@ -1834,9 +1836,9 @@ func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark
// Scan the value of a TAG-DIRECTIVE token.
//
// Scope:
-// %TAG !yaml! tag:yaml.org,2002: \n
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
+// %TAG !yaml! tag:yaml.org,2002: \n
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
func yaml_parser_scan_tag_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, handle, prefix *[]byte) bool {
var handle_value, prefix_value []byte
@@ -2847,7 +2849,7 @@ func yaml_parser_scan_line_comment(parser *yaml_parser_t, token_mark yaml_mark_t
continue
}
if parser.buffer[parser.buffer_pos+peek] == '#' {
- seen := parser.mark.index+peek
+ seen := parser.mark.index + peek
for {
if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
return false
@@ -2876,7 +2878,7 @@ func yaml_parser_scan_line_comment(parser *yaml_parser_t, token_mark yaml_mark_t
parser.comments = append(parser.comments, yaml_comment_t{
token_mark: token_mark,
start_mark: start_mark,
- line: text,
+ line: text,
})
}
return true
@@ -2910,7 +2912,7 @@ func yaml_parser_scan_comments(parser *yaml_parser_t, scan_mark yaml_mark_t) boo
// the foot is the line below it.
var foot_line = -1
if scan_mark.line > 0 {
- foot_line = parser.mark.line-parser.newlines+1
+ foot_line = parser.mark.line - parser.newlines + 1
if parser.newlines == 0 && parser.mark.column > 1 {
foot_line++
}
@@ -2996,7 +2998,7 @@ func yaml_parser_scan_comments(parser *yaml_parser_t, scan_mark yaml_mark_t) boo
recent_empty = false
// Consume until after the consumed comment line.
- seen := parser.mark.index+peek
+ seen := parser.mark.index + peek
for {
if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
return false
diff --git a/vendor/gopkg.in/yaml.v3/writerc.go b/vendor/gopkg.in/yaml.v3/writerc.go
index b8a116b..266d0b0 100644
--- a/vendor/gopkg.in/yaml.v3/writerc.go
+++ b/vendor/gopkg.in/yaml.v3/writerc.go
@@ -1,17 +1,17 @@
-//
+//
// Copyright (c) 2011-2019 Canonical Ltd
// Copyright (c) 2006-2010 Kirill Simonov
-//
+//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
// of the Software, and to permit persons to whom the Software is furnished to do
// so, subject to the following conditions:
-//
+//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
-//
+//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
diff --git a/vendor/gopkg.in/yaml.v3/yaml.go b/vendor/gopkg.in/yaml.v3/yaml.go
index 8cec6da..f0bedf3 100644
--- a/vendor/gopkg.in/yaml.v3/yaml.go
+++ b/vendor/gopkg.in/yaml.v3/yaml.go
@@ -17,8 +17,7 @@
//
// Source code and other details for the project are available at GitHub:
//
-// https://github.com/go-yaml/yaml
-//
+// https://github.com/go-yaml/yaml
package yaml
import (
@@ -75,16 +74,15 @@ type Marshaler interface {
//
// For example:
//
-// type T struct {
-// F int `yaml:"a,omitempty"`
-// B int
-// }
-// var t T
-// yaml.Unmarshal([]byte("a: 1\nb: 2"), &t)
+// type T struct {
+// F int `yaml:"a,omitempty"`
+// B int
+// }
+// var t T
+// yaml.Unmarshal([]byte("a: 1\nb: 2"), &t)
//
// See the documentation of Marshal for the format of tags and a list of
// supported tag options.
-//
func Unmarshal(in []byte, out interface{}) (err error) {
return unmarshal(in, out, false)
}
@@ -185,36 +183,35 @@ func unmarshal(in []byte, out interface{}, strict bool) (err error) {
//
// The field tag format accepted is:
//
-// `(...) yaml:"[][,[,]]" (...)`
+// `(...) yaml:"[][,[,]]" (...)`
//
// The following flags are currently supported:
//
-// omitempty Only include the field if it's not set to the zero
-// value for the type or to empty slices or maps.
-// Zero valued structs will be omitted if all their public
-// fields are zero, unless they implement an IsZero
-// method (see the IsZeroer interface type), in which
-// case the field will be excluded if IsZero returns true.
+// omitempty Only include the field if it's not set to the zero
+// value for the type or to empty slices or maps.
+// Zero valued structs will be omitted if all their public
+// fields are zero, unless they implement an IsZero
+// method (see the IsZeroer interface type), in which
+// case the field will be excluded if IsZero returns true.
//
-// flow Marshal using a flow style (useful for structs,
-// sequences and maps).
+// flow Marshal using a flow style (useful for structs,
+// sequences and maps).
//
-// inline Inline the field, which must be a struct or a map,
-// causing all of its fields or keys to be processed as if
-// they were part of the outer struct. For maps, keys must
-// not conflict with the yaml keys of other struct fields.
+// inline Inline the field, which must be a struct or a map,
+// causing all of its fields or keys to be processed as if
+// they were part of the outer struct. For maps, keys must
+// not conflict with the yaml keys of other struct fields.
//
// In addition, if the key is "-", the field is ignored.
//
// For example:
//
-// type T struct {
-// F int `yaml:"a,omitempty"`
-// B int
-// }
-// yaml.Marshal(&T{B: 2}) // Returns "b: 2\n"
-// yaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n"
-//
+// type T struct {
+// F int `yaml:"a,omitempty"`
+// B int
+// }
+// yaml.Marshal(&T{B: 2}) // Returns "b: 2\n"
+// yaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n"
func Marshal(in interface{}) (out []byte, err error) {
defer handleErr(&err)
e := newEncoder()
@@ -358,22 +355,21 @@ const (
//
// For example:
//
-// var person struct {
-// Name string
-// Address yaml.Node
-// }
-// err := yaml.Unmarshal(data, &person)
-//
+// var person struct {
+// Name string
+// Address yaml.Node
+// }
+// err := yaml.Unmarshal(data, &person)
+//
// Or by itself:
//
-// var person Node
-// err := yaml.Unmarshal(data, &person)
-//
+// var person Node
+// err := yaml.Unmarshal(data, &person)
type Node struct {
// Kind defines whether the node is a document, a mapping, a sequence,
// a scalar value, or an alias to another node. The specific data type of
// scalar nodes may be obtained via the ShortTag and LongTag methods.
- Kind Kind
+ Kind Kind
// Style allows customizing the apperance of the node in the tree.
Style Style
@@ -421,7 +417,6 @@ func (n *Node) IsZero() bool {
n.HeadComment == "" && n.LineComment == "" && n.FootComment == "" && n.Line == 0 && n.Column == 0
}
-
// LongTag returns the long form of the tag that indicates the data type for
// the node. If the Tag field isn't explicitly defined, one will be computed
// based on the node properties.
diff --git a/vendor/gopkg.in/yaml.v3/yamlh.go b/vendor/gopkg.in/yaml.v3/yamlh.go
index 7c6d007..ddcd551 100644
--- a/vendor/gopkg.in/yaml.v3/yamlh.go
+++ b/vendor/gopkg.in/yaml.v3/yamlh.go
@@ -438,7 +438,9 @@ type yaml_document_t struct {
// The number of written bytes should be set to the size_read variable.
//
// [in,out] data A pointer to an application data specified by
-// yaml_parser_set_input().
+//
+// yaml_parser_set_input().
+//
// [out] buffer The buffer to write the data from the source.
// [in] size The size of the buffer.
// [out] size_read The actual number of bytes read from the source.
@@ -639,7 +641,6 @@ type yaml_parser_t struct {
}
type yaml_comment_t struct {
-
scan_mark yaml_mark_t // Position where scanning for comments started
token_mark yaml_mark_t // Position after which tokens will be associated with this comment
start_mark yaml_mark_t // Position of '#' comment mark
@@ -659,13 +660,14 @@ type yaml_comment_t struct {
// @a buffer to the output.
//
// @param[in,out] data A pointer to an application data specified by
-// yaml_emitter_set_output().
+//
+// yaml_emitter_set_output().
+//
// @param[in] buffer The buffer with bytes to be written.
// @param[in] size The size of the buffer.
//
// @returns On success, the handler should return @c 1. If the handler failed,
// the returned value should be @c 0.
-//
type yaml_write_handler_t func(emitter *yaml_emitter_t, buffer []byte) error
type yaml_emitter_state_t int
diff --git a/vendor/gopkg.in/yaml.v3/yamlprivateh.go b/vendor/gopkg.in/yaml.v3/yamlprivateh.go
index e88f9c5..dea1ba9 100644
--- a/vendor/gopkg.in/yaml.v3/yamlprivateh.go
+++ b/vendor/gopkg.in/yaml.v3/yamlprivateh.go
@@ -1,17 +1,17 @@
-//
+//
// Copyright (c) 2011-2019 Canonical Ltd
// Copyright (c) 2006-2010 Kirill Simonov
-//
+//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
// of the Software, and to permit persons to whom the Software is furnished to do
// so, subject to the following conditions:
-//
+//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
-//
+//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -137,8 +137,8 @@ func is_crlf(b []byte, i int) bool {
func is_breakz(b []byte, i int) bool {
//return is_break(b, i) || is_z(b, i)
return (
- // is_break:
- b[i] == '\r' || // CR (#xD)
+ // is_break:
+ b[i] == '\r' || // CR (#xD)
b[i] == '\n' || // LF (#xA)
b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
@@ -151,8 +151,8 @@ func is_breakz(b []byte, i int) bool {
func is_spacez(b []byte, i int) bool {
//return is_space(b, i) || is_breakz(b, i)
return (
- // is_space:
- b[i] == ' ' ||
+ // is_space:
+ b[i] == ' ' ||
// is_breakz:
b[i] == '\r' || // CR (#xD)
b[i] == '\n' || // LF (#xA)
@@ -166,8 +166,8 @@ func is_spacez(b []byte, i int) bool {
func is_blankz(b []byte, i int) bool {
//return is_blank(b, i) || is_breakz(b, i)
return (
- // is_blank:
- b[i] == ' ' || b[i] == '\t' ||
+ // is_blank:
+ b[i] == ' ' || b[i] == '\t' ||
// is_breakz:
b[i] == '\r' || // CR (#xD)
b[i] == '\n' || // LF (#xA)