@@ -37,37 +37,56 @@ public static implicit operator string(TextValue value)
3737
3838 [ UsedImplicitly ]
3939 public new static string FriendlyName = "text value" ;
40-
41- public static string ParseValue ( string text , Script script ) => ExpressionRegex . Replace ( text , match =>
40+
41+ public static TryGet < ExpressionToken ? > ParseExpression ( string text , Script script )
4242 {
43- if ( match . Value . StartsWith ( "~" ) ) return match . Value [ 1 .. ] ;
43+ if ( text . StartsWith ( "~" ) ) return null as ExpressionToken ;
4444
45- if ( Tokenizer . SliceLine ( match . Value ) . HasErrored ( out var error , out var slices ) )
45+ if ( Tokenizer . SliceLine ( text ) . HasErrored ( out var error , out var enumSlices ) )
4646 {
47- Log . ScriptWarn ( script , error ) ;
48- return "<error>" ;
47+ return error ;
4948 }
5049
51- if ( slices . FirstOrDefault ( ) is not CollectionSlice { Type : CollectionBrackets . Curly } collection )
50+ if ( enumSlices . ToArray ( ) is not [ CollectionSlice { Type : CollectionBrackets . Curly } collection ] )
5251 {
53- throw new AndrzejFuckedUpException ( ) ;
52+ return "Parsing failed" ;
5453 }
5554
5655 // ReSharper disable once DuplicatedSequentialIfBodies
5756 if ( ExpressionToken . TryParse ( collection , script ) . HasErrored ( out error , out var token ) )
5857 {
59- Log . ScriptWarn ( script , error ) ;
60- return "<error>" ;
58+ return error ;
6159 }
6260
63- if ( ( ( BaseToken ) token ) . TryGet < LiteralValue > ( ) . HasErrored ( out error , out var value ) )
61+ return token ;
62+ }
63+
64+ public static bool HasExpression ( string text ) => ExpressionRegex . IsMatch ( text ) ;
65+
66+ public static string ParseValue ( string text , Script script ) => ExpressionRegex . Replace ( text , match =>
67+ {
68+ if ( ParseExpression ( match . Value , script ) . HasErrored ( out var error , out var token )
69+ || ( ( BaseToken ) token ) . TryGet < LiteralValue > ( ) . HasErrored ( out error , out var value ) )
6470 {
6571 Log . ScriptWarn ( script , error ) ;
6672 return "<error>" ;
6773 }
68-
74+
6975 return value . StringRep ;
7076 } ) ;
77+
78+ public static Result Lint ( string text , Script script )
79+ {
80+ foreach ( var match in ExpressionRegex . Matches ( text ) . Cast < Match > ( ) )
81+ {
82+ if ( ParseExpression ( match . Value , script ) . HasErrored ( out var error , out var token ) )
83+ {
84+ return error ;
85+ }
86+ }
87+
88+ return true ;
89+ }
7190
7291 private class Prop < T > ( Func < TextValue , T > handler , string ? description )
7392 : IValueWithProperties . PropInfo < TextValue , T > ( handler , description ) where T : Value ;
0 commit comments