diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c14dbb2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.md +mdsh diff --git a/monthly.md b/monthly.md index db3cdd4..ce95f25 100644 --- a/monthly.md +++ b/monthly.md @@ -1,32 +1,45 @@ --- -output: "reports_{{.from}}.md" +output: "reports_{{.b}}.md" params: - from: + b: required: true - to: + usage: | + Required. + The begin time of report. + Examples: + 2025 + 2025-07 + 2025-07-15 + Jul + e: required: true - file: + usage: | + Required. + The end time of report. + Same format as -b + f: default: ~/.hledger.journal + usage: The ledger file to parse --- -# Finance Report from {{.from}} to {{.to}} +# Finance Report from {{.b}} to {{.e}} ## Previous status: -{{ sh "hledger -f $file balancesheet -e $from" }} +{{ sh "hledger -f $f balancesheet -e $b" }} ## Expenses: ### Expense Summary by Category -{{ sh "hledger -f $file bal expenses -b $from -e $to --depth 3 --sort amount" }} +{{ sh "hledger -f $f bal expenses -b $b -e $e --depth 3 --sort amount" }} -{{ sh "hledger -f $file bal expenses -b $from -e $to --depth 2 --sort amount" }} +{{ sh "hledger -f $f bal expenses -b $b -e $e --depth 2 --sort amount" }} ## Net Income: -{{sh "hledger -f $file income -b $from -e $to --monthly"}} +{{sh "hledger -f $f income -b $b -e $e --monthly"}} ## Ending balance: -{{sh "hledger -f $file balancesheet -e $to"}} +{{sh "hledger -f $f balancesheet -e $e"}} diff --git a/params.go b/params.go index b3bbcee..0730a08 100644 --- a/params.go +++ b/params.go @@ -1,6 +1,7 @@ package main import ( + "errors" "flag" "fmt" "os" @@ -10,16 +11,21 @@ func parseParams(meta TemplateMeta) (ctx TemplateContext, err error) { result := make(map[string]*string) fs := flag.NewFlagSet("params", flag.ExitOnError) for key, spec := range meta.Params { - result[key] = fs.String(key, spec.Default, key) + result[key] = fs.String(key, spec.Default, spec.Usage) } fs.Parse(os.Args[2:]) ctx = make(TemplateContext) + message := "" for key, spec := range meta.Params { if spec.Required && *result[key] == "" { - err = fmt.Errorf("parameter '%s' required but not provided", key) - return + message += fmt.Sprintf("parameter '%s' required but not provided\n", key) + continue } ctx[key] = *result[key] } + if message != "" { + message += fmt.Sprintf("Use 'mdsh %s --help' to see usage", os.Args[1]) + return nil, errors.New(message) + } return } diff --git a/types.go b/types.go index 0eadc74..780a6ac 100644 --- a/types.go +++ b/types.go @@ -36,6 +36,7 @@ func (meta TemplateMeta) OutputFile(ctx TemplateContext) (output string, err err type ParamSpec struct { Required bool `yaml:"required"` Default string `yaml:"default"` + Usage string `yaml:"usage"` } type TemplateContext map[string]string