@@ -13,6 +13,7 @@ import (
1313 "strconv"
1414 "sort"
1515 "regexp"
16+ "slices"
1617)
1718
1819func 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