# CliGen::Command Macros ## TOC - [Overview](#Overview) ## Overview This page is dedicated to discussing the macros associated & embedded in the `CliGen::Command` class. ## Macros ### argument This macro used in a Command subclass does one thing and well. It helps define an instance variable with valid annotation keys and helps debug any misconfigurations before you experience them via the compiler and/or during runtime. ```crystal require "cligen" @[CliGen::CommandInfo(description: "Thing")] class MyClass << CliGen::Command argument(myvar : String = "abc", description: "This var changes the printed string", options: %w[ abc def ghi ] ) def main puts "Chosen string : %s" % @myvar end end ``` *Example: String Argument* The above essentialy expands out to the following ```crystal require "cligen" @[CliGen::CommandInfo(description: "Thing")] class MyClass << CliGen::Command @[CliGen::Argument(description: "This var changes the printed string", options: %w[ abc def ghi ])] @myvar : String = "abc" def main puts "Chosen string : %s" % @myvar end end ``` It simply provides you a user friendly "DSL" to define a (sometimes) extensive annotation that would be a PITA to do by hand. However, the use of the macro has much more attributed to it than just doing this. For a more detailed walkthrough & it's required keys go to the [argument macro doc](./Macro/argument.md).