Skip to content

Commit 9aabe9c

Browse files
committed
Add a bunch of funcs needed to implement shadow configs
Specifically - home - include_if_exists - concat
1 parent 8ba754d commit 9aabe9c

File tree

1 file changed

+68
-13
lines changed

1 file changed

+68
-13
lines changed

markut.go

Lines changed: 68 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"strconv"
1414
"sort"
1515
"regexp"
16+
"slices"
1617
)
1718

1819
func decomposeMillis(millis Millis) (hh int64, mm int64, ss int64, ms int64, sign string) {
@@ -419,11 +420,21 @@ func (context *EvalContext) evalMarkutContent(content string, path string) bool
419420
return true
420421
}
421422

422-
func (context *EvalContext) evalMarkutFile(path string) bool {
423+
func (context *EvalContext) evalMarkutFile(loc *Loc, path string, ignoreIfMissing bool) bool {
423424
content, err := ioutil.ReadFile(path)
424425
if err != nil {
425-
fmt.Printf("ERROR: could not read file %s: %s\n", path, err)
426-
return false
426+
sb := strings.Builder{}
427+
if loc != nil {
428+
sb.WriteString(fmt.Sprintf("%s: ", *loc));
429+
}
430+
if ignoreIfMissing {
431+
sb.WriteString("WARNING: ")
432+
} else {
433+
sb.WriteString("ERROR: ")
434+
}
435+
sb.WriteString(fmt.Sprintf("%s", err))
436+
fmt.Printf("%s\n", sb.String())
437+
return ignoreIfMissing
427438
}
428439

429440
return context.evalMarkutContent(string(content), path)
@@ -680,7 +691,7 @@ var Subcommands = map[string]Subcommand{
680691
}
681692

682693
context, ok := defaultContext()
683-
ok = ok && context.evalMarkutFile(*markutPtr) && context.finishEval()
694+
ok = ok && context.evalMarkutFile(nil, *markutPtr, false) && context.finishEval()
684695
if !ok {
685696
return false
686697
}
@@ -757,7 +768,7 @@ var Subcommands = map[string]Subcommand{
757768
}
758769

759770
context, ok := defaultContext();
760-
ok = ok && context.evalMarkutFile(*markutPtr) && context.finishEval()
771+
ok = ok && context.evalMarkutFile(nil, *markutPtr, false) && context.finishEval()
761772
if !ok {
762773
return false
763774
}
@@ -796,7 +807,7 @@ var Subcommands = map[string]Subcommand{
796807
}
797808

798809
context, ok := defaultContext()
799-
ok = ok && context.evalMarkutFile(*markutPtr) && context.finishEval()
810+
ok = ok && context.evalMarkutFile(nil, *markutPtr, false) && context.finishEval()
800811
if !ok {
801812
return false
802813
}
@@ -848,7 +859,7 @@ var Subcommands = map[string]Subcommand{
848859
}
849860

850861
context, ok := defaultContext();
851-
ok = ok && context.evalMarkutFile(*markutPtr) && context.finishEval()
862+
ok = ok && context.evalMarkutFile(nil, *markutPtr, false) && context.finishEval()
852863
if !ok {
853864
return false
854865
}
@@ -880,7 +891,7 @@ var Subcommands = map[string]Subcommand{
880891
}
881892

882893
context, ok := defaultContext()
883-
ok = ok && context.evalMarkutFile(*markutPtr) && context.finishEval()
894+
ok = ok && context.evalMarkutFile(nil, *markutPtr, false) && context.finishEval()
884895
if !ok {
885896
return false
886897
}
@@ -930,7 +941,7 @@ var Subcommands = map[string]Subcommand{
930941
}
931942

932943
context, ok := defaultContext();
933-
ok = ok && context.evalMarkutFile(*markutPtr) && context.finishEval()
944+
ok = ok && context.evalMarkutFile(nil, *markutPtr, false) && context.finishEval()
934945
if !ok {
935946
return false
936947
}
@@ -986,7 +997,7 @@ var Subcommands = map[string]Subcommand{
986997
// rsync(1) is as atomic as rename(2). So it's alright for majority of the cases.
987998

988999
context, ok := defaultContext();
989-
ok = ok && context.evalMarkutFile(*markutPtr) && context.finishEval()
1000+
ok = ok && context.evalMarkutFile(nil, *markutPtr, false) && context.finishEval()
9901001
if !ok {
9911002
return false
9921003
}
@@ -1018,7 +1029,7 @@ var Subcommands = map[string]Subcommand{
10181029
}
10191030

10201031
context, ok := defaultContext()
1021-
ok = ok && context.evalMarkutFile(*markutPtr) && context.finishEval()
1032+
ok = ok && context.evalMarkutFile(nil, *markutPtr, false) && context.finishEval()
10221033
if !ok {
10231034
return false
10241035
}
@@ -1483,7 +1494,7 @@ func main() {
14831494
},
14841495
},
14851496
"include": {
1486-
Description: "Include another MARKUT file",
1497+
Description: "Include another MARKUT file and fail if it does not exist.",
14871498
Category: "Misc",
14881499
Signature: "<path:String> --",
14891500
Run: func(context *EvalContext, command string, token Token) bool {
@@ -1494,9 +1505,53 @@ func main() {
14941505
return false
14951506
}
14961507
path := args[0]
1497-
if !context.evalMarkutFile(string(path.Text)) {
1508+
return context.evalMarkutFile(&path.Loc, string(path.Text), false)
1509+
},
1510+
},
1511+
"include_if_exists": {
1512+
Description: "Try to include another MARKUT file but do not fail if it does not exist.",
1513+
Category: "Misc",
1514+
Signature: "<path:String> --",
1515+
Run: func(context *EvalContext, command string, token Token) bool {
1516+
args, err := context.typeCheckArgs(token.Loc, TokenString)
1517+
if err != nil {
1518+
fmt.Printf("%s: ERROR: type check failed for %s\n", token.Loc, command)
1519+
fmt.Printf("%s\n", err)
14981520
return false
14991521
}
1522+
path := args[0]
1523+
return context.evalMarkutFile(&path.Loc, string(path.Text), true)
1524+
},
1525+
},
1526+
"home": {
1527+
Description: "Path to the home folder.",
1528+
Category: "Misc",
1529+
Signature: "-- <path:String>",
1530+
Run: func(context *EvalContext, command string, token Token) bool {
1531+
context.argsStack = append(context.argsStack, Token{
1532+
Kind: TokenString,
1533+
Text: []rune(os.Getenv("HOME")),
1534+
Loc: token.Loc,
1535+
})
1536+
return true
1537+
},
1538+
},
1539+
"concat": {
1540+
Description: "Concatenate two strings.",
1541+
Category: "Misc",
1542+
Signature: "<a:String> <b:String> -- <a++b:String>",
1543+
Run: func(context *EvalContext, command string, token Token) bool {
1544+
args, err := context.typeCheckArgs(token.Loc, TokenString, TokenString)
1545+
if err != nil {
1546+
fmt.Printf("%s: ERROR: type check failed for %s\n", token.Loc, command)
1547+
fmt.Printf("%s\n", err)
1548+
return false
1549+
}
1550+
context.argsStack = append(context.argsStack, Token{
1551+
Kind: TokenString,
1552+
Text: slices.Concat(args[1].Text, args[0].Text),
1553+
Loc: token.Loc,
1554+
});
15001555
return true
15011556
},
15021557
},

0 commit comments

Comments
 (0)