<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Advanced on Go Subcommand</title><link>https://arran4.github.io/go-subcommand/docs/advanced/</link><description>Recent content in Advanced on Go Subcommand</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://arran4.github.io/go-subcommand/docs/advanced/index.xml" rel="self" type="application/rss+xml"/><item><title>Generator design principles</title><link>https://arran4.github.io/go-subcommand/docs/advanced/generator-design-principles/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arran4.github.io/go-subcommand/docs/advanced/generator-design-principles/</guid><description>&lt;h1 id="generator-design-principles"&gt;Generator design principles&lt;a class="anchor" href="#generator-design-principles"&gt;#&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class='book-hint '&gt;&#10;&lt;p&gt;&lt;strong&gt;go-subcommand owns command execution and process policy. User functions supply actions, initialization and dependencies. Templates remain an optional escape hatch.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;The preferred workflow is deliberately small: &lt;strong&gt;write a Go function, document it with a Go comment, generate, and run&lt;/strong&gt;. A user should not need to understand the generated entry point, implement dispatch, manually register callbacks, or customize templates to get a usable CLI.&lt;/p&gt;&#10;&lt;p&gt;For example, the ordinary current workflow begins with:&lt;/p&gt;</description></item><item><title>Project generation configuration</title><link>https://arran4.github.io/go-subcommand/docs/advanced/project-configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arran4.github.io/go-subcommand/docs/advanced/project-configuration/</guid><description>&lt;p&gt;&lt;code&gt;gosubc generate --config gosubc.mdc&lt;/code&gt; reads optional generator settings.&#10;Both &lt;code&gt;.mdc&lt;/code&gt; and &lt;code&gt;.mdconf&lt;/code&gt; are supported candidates; neither filename is required.&#10;Generated applications do not read this file or depend on go-subcommand at runtime.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;format-version: 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cli-parser: gnu&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;recursive: true&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;emit-go-generate: false&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;paths:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- commands&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Explicit flags override file values, including &lt;code&gt;--recursive=false&lt;/code&gt; and&#10;&lt;code&gt;--prov-version=&lt;/code&gt;. File settings override built-in defaults. Settings belong at&#10;the top, without a &lt;code&gt;# Configuration&lt;/code&gt; heading. Generator settings are &lt;code&gt;dir&lt;/code&gt;,&#10;&lt;code&gt;man-dir&lt;/code&gt;, &lt;code&gt;parser-name&lt;/code&gt;, &lt;code&gt;cli-parser&lt;/code&gt;, &lt;code&gt;paths&lt;/code&gt;, &lt;code&gt;recursive&lt;/code&gt;,&#10;&lt;code&gt;force&lt;/code&gt;, &lt;code&gt;clean&lt;/code&gt;, &lt;code&gt;replace-templates&lt;/code&gt;, &lt;code&gt;project-provenance&lt;/code&gt; (alias &lt;code&gt;project&lt;/code&gt;),&#10;&lt;code&gt;timestamp&lt;/code&gt;, &lt;code&gt;emit-go-generate&lt;/code&gt;, &lt;code&gt;prov-version&lt;/code&gt;, &lt;code&gt;prov-commit&lt;/code&gt;, and &lt;code&gt;prov-date&lt;/code&gt;.&#10;Keys ignore case, hyphens and underscores. &lt;code&gt;version&lt;/code&gt; is an alias for&#10;&lt;code&gt;format-version&lt;/code&gt;, and one version declaration is required.&lt;/p&gt;</description></item><item><title>Functionless command metadata</title><link>https://arran4.github.io/go-subcommand/docs/advanced/command-metadata/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arran4.github.io/go-subcommand/docs/advanced/command-metadata/</guid><description>&lt;p&gt;Use a package or standalone comment to describe a root or child without&#10;registering an executable action:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// App is a command `app` -- Manage jobs.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// More application help.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;package&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;commands&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Generate is a subcommand `app generate` -- Generate jobs.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Generate&lt;/span&gt;() { &lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;generate&amp;#34;&lt;/span&gt;) }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;app&lt;/code&gt; prints described help on stderr and exits 0. &lt;code&gt;app generate&lt;/code&gt; prints&#10;&lt;code&gt;generate&lt;/code&gt; on stdout. &lt;code&gt;app unknown&lt;/code&gt; returns an unknown-command error and status 1.&#10;&lt;code&gt;app help&lt;/code&gt;, &lt;code&gt;app usage&lt;/code&gt;, &lt;code&gt;app --help&lt;/code&gt;, recursive help and version keep normal&#10;dispatch behaviour and do not acquire business providers.&lt;/p&gt;</description></item><item><title>Generated errors and process boundary</title><link>https://arran4.github.io/go-subcommand/docs/advanced/generated-errors/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arran4.github.io/go-subcommand/docs/advanced/generated-errors/</guid><description>&lt;p&gt;Generated &lt;code&gt;cmd&lt;/code&gt; packages expose &lt;code&gt;ErrUsage&lt;/code&gt; and &lt;code&gt;*UsageError&lt;/code&gt;. These are generated&#10;application types; applications do not import go-subcommand at runtime.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;usage&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;cmd&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;UsageError&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;errors&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Is&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;cmd&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ErrUsage&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;errors&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;As&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;usage&lt;/span&gt;) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%s: kind=%s flag=%s\n&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;usage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;CommandPath&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;usage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Kind&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;usage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Flag&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The stable kinds are &lt;code&gt;UsageUnknownCommand&lt;/code&gt;, &lt;code&gt;UsageUnknownFlag&lt;/code&gt;,&#10;&lt;code&gt;UsageMissingFlagValue&lt;/code&gt;, &lt;code&gt;UsageInvalidValue&lt;/code&gt;, &lt;code&gt;UsageInvalidArguments&lt;/code&gt;, and&#10;&lt;code&gt;UsageMissingRequiredFlag&lt;/code&gt;. The error holds a canonical command path, a flag name&#10;without leading dashes where applicable, an optional underlying cause, and a&#10;presentation message. Classification never depends on matching that message.&#10;Causes remain available through &lt;code&gt;errors.Is&lt;/code&gt; and &lt;code&gt;errors.As&lt;/code&gt;. Application-provided&#10;usage errors and explicit exit errors retain their wrappers when returned from&#10;dispatch.&lt;/p&gt;</description></item><item><title>No-command policy</title><link>https://arran4.github.io/go-subcommand/docs/advanced/no-command-policy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://arran4.github.io/go-subcommand/docs/advanced/no-command-policy/</guid><description>&lt;p&gt;Use functionless root metadata to require a selected command:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// App is a command `app` -- Run jobs.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// No command: error&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;package&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;commands&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Run is a subcommand `app run` -- Run a job.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Run&lt;/span&gt;() { &lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;run&amp;#34;&lt;/span&gt;) }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or place the same directive in native configuration:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;format-version: 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Commands&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;```command: app&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Description: Run jobs.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;No command: error&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Invocation&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;stdout&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;stderr&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Status&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;app&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;empty&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;Error: no command provided&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;app --&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;empty&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;Error: no command provided&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;app run&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;run&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;empty&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;app help&lt;/code&gt;, &lt;code&gt;app usage&lt;/code&gt;, &lt;code&gt;app --help&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;empty&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;normal help&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;app version&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;normal version&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;empty&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;app missing&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;empty&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;usage and unknown-command error&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;app -- run&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;empty&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;usage and unknown-command error&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;The directive is an execution policy, independent of executable routing. When&#10;omitted, bare invocation preserves existing help and status 0. Only &lt;code&gt;error&lt;/code&gt; is&#10;accepted. Empty/unknown values, duplicate declarations and policies on children&#10;are generation errors with source filename and line diagnostics. A real root&#10;action or any default route, including a help route or a child marked default,&#10;conflicts with the policy. Put it in root metadata rather than an action comment.&lt;/p&gt;</description></item></channel></rss>