@@ -7,6 +7,7 @@ use tree_sitter::Parser;
7
7
8
8
use crate :: error:: SshdConfigError ;
9
9
use crate :: metadata:: { MULTI_ARG_KEYWORDS , REPEATABLE_KEYWORDS } ;
10
+ use rust_i18n:: t;
10
11
11
12
#[ derive( Debug , JsonSchema ) ]
12
13
pub struct SshdConfigParser {
@@ -35,14 +36,14 @@ impl SshdConfigParser {
35
36
parser. set_language ( & tree_sitter_ssh_server_config:: LANGUAGE . into ( ) ) ?;
36
37
37
38
let Some ( tree) = & mut parser. parse ( input, None ) else {
38
- return Err ( SshdConfigError :: ParserError ( format ! ( "failed to parse: { input}" ) ) ) ;
39
+ return Err ( SshdConfigError :: ParserError ( t ! ( "parser.failedToParse" , input = input) . to_string ( ) ) ) ;
39
40
} ;
40
41
let root_node = tree. root_node ( ) ;
41
42
if root_node. is_error ( ) {
42
- return Err ( SshdConfigError :: ParserError ( format ! ( "failed to parse root: { input}" ) ) ) ;
43
+ return Err ( SshdConfigError :: ParserError ( t ! ( "parser.failedToParseRoot" , input = input) . to_string ( ) ) ) ;
43
44
}
44
45
if root_node. kind ( ) != "server_config" {
45
- return Err ( SshdConfigError :: ParserError ( format ! ( "invalid config: { input}" ) ) ) ;
46
+ return Err ( SshdConfigError :: ParserError ( t ! ( "parser.invalidConfig" , input = input) . to_string ( ) ) ) ;
46
47
}
47
48
let input_bytes = input. as_bytes ( ) ;
48
49
let mut cursor = root_node. walk ( ) ;
@@ -54,12 +55,12 @@ impl SshdConfigParser {
54
55
55
56
fn parse_child_node ( & mut self , node : tree_sitter:: Node , input : & str , input_bytes : & [ u8 ] ) -> Result < ( ) , SshdConfigError > {
56
57
if node. is_error ( ) {
57
- return Err ( SshdConfigError :: ParserError ( format ! ( "failed to parse: { input}" ) ) ) ;
58
+ return Err ( SshdConfigError :: ParserError ( t ! ( "parser.failedToParse" , input = input) . to_string ( ) ) ) ;
58
59
}
59
60
match node. kind ( ) {
60
61
"keyword" => self . parse_keyword_node ( node, input, input_bytes) ,
61
62
"comment" | "empty_line" => Ok ( ( ) ) ,
62
- _ => Err ( SshdConfigError :: ParserError ( format ! ( "unknown node type: {}" , node. kind( ) ) ) ) ,
63
+ _ => Err ( SshdConfigError :: ParserError ( t ! ( "parser.unknownNodeType" , node = node. kind( ) ) . to_string ( ) ) ) ,
63
64
}
64
65
}
65
66
@@ -72,9 +73,9 @@ impl SshdConfigParser {
72
73
73
74
if let Some ( keyword) = keyword_node. child_by_field_name ( "keyword" ) {
74
75
let Ok ( text) = keyword. utf8_text ( input_bytes) else {
75
- return Err ( SshdConfigError :: ParserError ( format ! (
76
- "failed to parse keyword node: { input}"
77
- ) ) ) ;
76
+ return Err ( SshdConfigError :: ParserError (
77
+ t ! ( "parser.failedToParseChildNode" , input = input) . to_string ( )
78
+ ) ) ;
78
79
} ;
79
80
if REPEATABLE_KEYWORDS . contains ( & text) {
80
81
is_repeatable = true ;
@@ -87,19 +88,19 @@ impl SshdConfigParser {
87
88
88
89
for node in keyword_node. named_children ( & mut cursor) {
89
90
if node. is_error ( ) {
90
- return Err ( SshdConfigError :: ParserError ( format ! ( "failed to parse child node: { input}" ) ) ) ;
91
+ return Err ( SshdConfigError :: ParserError ( t ! ( "parser.failedToParseChildNode" , input = input) . to_string ( ) ) ) ;
91
92
}
92
93
if node. kind ( ) == "arguments" {
93
94
value = parse_arguments_node ( node, input, input_bytes, is_vec) ?;
94
95
}
95
96
}
96
97
if let Some ( key) = key {
97
98
if value. is_null ( ) {
98
- return Err ( SshdConfigError :: ParserError ( format ! ( "missing value in child node: { input}" ) ) ) ;
99
+ return Err ( SshdConfigError :: ParserError ( t ! ( "parser.missingValueInChildNode" , input = input) . to_string ( ) ) ) ;
99
100
}
100
101
return self . update_map ( & key, value, is_repeatable) ;
101
102
}
102
- Err ( SshdConfigError :: ParserError ( format ! ( "missing key in child node: { input}" ) ) )
103
+ Err ( SshdConfigError :: ParserError ( t ! ( "parser.missingKeyInChildNode" , input = input) . to_string ( ) ) )
103
104
}
104
105
105
106
fn update_map ( & mut self , key : & str , value : Value , is_repeatable : bool ) -> Result < ( ) , SshdConfigError > {
@@ -114,19 +115,19 @@ impl SshdConfigParser {
114
115
}
115
116
} else {
116
117
return Err ( SshdConfigError :: ParserError (
117
- "value is not an array" . to_string ( ) ,
118
+ t ! ( "parser.failedToParseAsArray" ) . to_string ( )
118
119
) ) ;
119
120
}
120
121
} else {
121
122
return Err ( SshdConfigError :: ParserError (
122
- "value is not an array" . to_string ( ) ,
123
+ t ! ( "parser.failedToParseAsArray" ) . to_string ( )
123
124
) ) ;
124
125
}
125
126
} else {
126
- return Err ( SshdConfigError :: ParserError ( format ! ( "key { key} not found" ) ) ) ;
127
+ return Err ( SshdConfigError :: ParserError ( t ! ( "parser.keyNotFound" , key = key ) . to_string ( ) ) ) ;
127
128
}
128
129
} else {
129
- return Err ( SshdConfigError :: ParserError ( format ! ( "key { key} is not repeatable" ) ) ) ;
130
+ return Err ( SshdConfigError :: ParserError ( t ! ( "parser.keyNotRepeatable" , key = key ) . to_string ( ) ) ) ;
130
131
}
131
132
} else {
132
133
self . map . insert ( key. to_string ( ) , value) ;
@@ -142,32 +143,32 @@ fn parse_arguments_node(arg_node: tree_sitter::Node, input: &str, input_bytes: &
142
143
for node in arg_node. named_children ( & mut cursor) {
143
144
144
145
if node. is_error ( ) {
145
- return Err ( SshdConfigError :: ParserError ( format ! ( "failed to parse child node: { input}" ) ) ) ;
146
+ return Err ( SshdConfigError :: ParserError ( t ! ( "parser.failedToParseChildNode" , input = input) . to_string ( ) ) ) ;
146
147
}
147
148
let argument: Value = match node. kind ( ) {
148
149
"boolean" | "string" => {
149
150
let Ok ( arg) = node. utf8_text ( input_bytes) else {
150
- return Err ( SshdConfigError :: ParserError ( format ! (
151
- "failed to parse string node: { input}"
152
- ) ) ) ;
151
+ return Err ( SshdConfigError :: ParserError (
152
+ t ! ( "parser.failedToParseNode" , input = input) . to_string ( )
153
+ ) ) ;
153
154
} ;
154
155
Value :: String ( arg. to_string ( ) )
155
156
}
156
157
"number" => {
157
158
let Ok ( arg) = node. utf8_text ( input_bytes) else {
158
- return Err ( SshdConfigError :: ParserError ( format ! (
159
- "failed to parse string node: { input}"
160
- ) ) ) ;
159
+ return Err ( SshdConfigError :: ParserError (
160
+ t ! ( "parser.failedToParseNode" , input = input) . to_string ( )
161
+ ) ) ;
161
162
} ;
162
163
Value :: Number ( arg. parse :: < u64 > ( ) ?. into ( ) )
163
164
}
164
165
"operator" => {
165
166
// TODO: handle operator if not parsing from SSHD -T
166
- return Err ( SshdConfigError :: ParserError ( format ! (
167
- "todo - unsuported node: {}" , node . kind ( )
168
- ) ) ) ;
167
+ return Err ( SshdConfigError :: ParserError (
168
+ t ! ( "parser.invalidValue" ) . to_string ( )
169
+ ) ) ;
169
170
}
170
- _ => return Err ( SshdConfigError :: ParserError ( format ! ( "unknown node: {} " , node. kind( ) ) ) )
171
+ _ => return Err ( SshdConfigError :: ParserError ( t ! ( "parser.unknownNode " , kind = node. kind( ) ) . to_string ( ) ) )
171
172
} ;
172
173
if is_vec {
173
174
vec. push ( argument) ;
0 commit comments