11use serde:: { Deserialize , Serialize } ;
22use serde_json:: Value ;
33use std:: collections:: HashMap ;
4+ use std:: convert:: TryFrom ;
45use std:: path:: PathBuf ;
56
67#[ derive(
@@ -22,6 +23,64 @@ pub trait Request {
2223 const COMMAND : & ' static str ;
2324}
2425
26+ #[ derive( Copy , Debug , Default , PartialEq , Eq , Clone , Deserialize , Serialize ) ]
27+ pub struct Line ( u32 ) ;
28+
29+ impl TryFrom < Line > for usize {
30+ type Error = ( ) ;
31+
32+ fn try_from ( value : Line ) -> Result < Self , Self :: Error > {
33+ ( value. 0 as usize ) . checked_sub ( 1 ) . ok_or ( ( ) )
34+ }
35+ }
36+
37+ impl TryFrom < usize > for Line {
38+ type Error = ( ) ;
39+
40+ fn try_from ( value : usize ) -> Result < Self , Self :: Error > {
41+ if let Some ( value) = ( value as u32 ) . checked_add ( 1 ) {
42+ Ok ( Line ( value) )
43+ } else {
44+ Err ( ( ) )
45+ }
46+ }
47+ }
48+
49+ impl TryFrom < Line > for u32 {
50+ type Error = ( ) ;
51+
52+ fn try_from ( value : Line ) -> Result < Self , Self :: Error > {
53+ value. 0 . checked_sub ( 1 ) . ok_or ( ( ) )
54+ }
55+ }
56+
57+ #[ derive( Copy , Debug , Default , PartialEq , Eq , Clone , Deserialize , Serialize ) ]
58+ pub struct Column ( u32 ) ;
59+
60+ impl Column {
61+ pub fn saturating_sub ( self , rhs : u32 ) -> Self {
62+ Self ( self . 0 . saturating_sub ( rhs) )
63+ }
64+ }
65+
66+ impl From < usize > for Column {
67+ fn from ( column : usize ) -> Self {
68+ Column ( column as u32 )
69+ }
70+ }
71+
72+ impl From < Column > for usize {
73+ fn from ( column : Column ) -> Self {
74+ column. 0 as usize
75+ }
76+ }
77+
78+ impl From < Column > for u32 {
79+ fn from ( column : Column ) -> Self {
80+ column. 0
81+ }
82+ }
83+
2584#[ derive( Debug , PartialEq , Eq , Clone , Deserialize , Serialize ) ]
2685#[ serde( rename_all = "camelCase" ) ]
2786pub struct ColumnDescriptor {
@@ -162,9 +221,9 @@ pub struct Source {
162221#[ derive( Debug , Default , PartialEq , Eq , Clone , Deserialize , Serialize ) ]
163222#[ serde( rename_all = "camelCase" ) ]
164223pub struct SourceBreakpoint {
165- pub line : usize ,
224+ pub line : Line ,
166225 #[ serde( skip_serializing_if = "Option::is_none" ) ]
167- pub column : Option < usize > ,
226+ pub column : Option < Column > ,
168227 #[ serde( skip_serializing_if = "Option::is_none" ) ]
169228 pub condition : Option < String > ,
170229 #[ serde( skip_serializing_if = "Option::is_none" ) ]
@@ -184,13 +243,13 @@ pub struct Breakpoint {
184243 #[ serde( skip_serializing_if = "Option::is_none" ) ]
185244 pub source : Option < Source > ,
186245 #[ serde( skip_serializing_if = "Option::is_none" ) ]
187- pub line : Option < usize > ,
246+ pub line : Option < Line > ,
188247 #[ serde( skip_serializing_if = "Option::is_none" ) ]
189- pub column : Option < usize > ,
248+ pub column : Option < Column > ,
190249 #[ serde( skip_serializing_if = "Option::is_none" ) ]
191- pub end_line : Option < usize > ,
250+ pub end_line : Option < Line > ,
192251 #[ serde( skip_serializing_if = "Option::is_none" ) ]
193- pub end_column : Option < usize > ,
252+ pub end_column : Option < Column > ,
194253 #[ serde( skip_serializing_if = "Option::is_none" ) ]
195254 pub instruction_reference : Option < String > ,
196255 #[ serde( skip_serializing_if = "Option::is_none" ) ]
@@ -223,12 +282,12 @@ pub struct StackFrame {
223282 pub name : String ,
224283 #[ serde( skip_serializing_if = "Option::is_none" ) ]
225284 pub source : Option < Source > ,
226- pub line : usize ,
227- pub column : usize ,
285+ pub line : Line ,
286+ pub column : Column ,
228287 #[ serde( skip_serializing_if = "Option::is_none" ) ]
229- pub end_line : Option < usize > ,
288+ pub end_line : Option < Line > ,
230289 #[ serde( skip_serializing_if = "Option::is_none" ) ]
231- pub end_column : Option < usize > ,
290+ pub end_column : Option < Column > ,
232291 #[ serde( skip_serializing_if = "Option::is_none" ) ]
233292 pub can_restart : Option < bool > ,
234293 #[ serde( skip_serializing_if = "Option::is_none" ) ]
@@ -261,13 +320,13 @@ pub struct Scope {
261320 #[ serde( skip_serializing_if = "Option::is_none" ) ]
262321 pub source : Option < Source > ,
263322 #[ serde( skip_serializing_if = "Option::is_none" ) ]
264- pub line : Option < usize > ,
323+ pub line : Option < Line > ,
265324 #[ serde( skip_serializing_if = "Option::is_none" ) ]
266- pub column : Option < usize > ,
325+ pub column : Option < Column > ,
267326 #[ serde( skip_serializing_if = "Option::is_none" ) ]
268- pub end_line : Option < usize > ,
327+ pub end_line : Option < Line > ,
269328 #[ serde( skip_serializing_if = "Option::is_none" ) ]
270- pub end_column : Option < usize > ,
329+ pub end_column : Option < Column > ,
271330}
272331
273332#[ derive( Debug , PartialEq , Eq , Clone , Deserialize , Serialize ) ]
@@ -820,9 +879,9 @@ pub mod events {
820879 #[ serde( skip_serializing_if = "Option::is_none" ) ]
821880 pub group : Option < String > ,
822881 #[ serde( skip_serializing_if = "Option::is_none" ) ]
823- pub line : Option < usize > ,
882+ pub line : Option < Line > ,
824883 #[ serde( skip_serializing_if = "Option::is_none" ) ]
825- pub column : Option < usize > ,
884+ pub column : Option < Column > ,
826885 #[ serde( skip_serializing_if = "Option::is_none" ) ]
827886 pub variables_reference : Option < usize > ,
828887 #[ serde( skip_serializing_if = "Option::is_none" ) ]
0 commit comments