11use crate :: errors:: TypeError ;
22use crate :: prelude:: * ;
3+ use core:: fmt:: { Debug , Formatter , Result as DebugResult } ;
34use core:: ops:: Deref ;
45use lcp_proto:: { google:: protobuf:: Any as ProtoAny , protobuf:: Protobuf } ;
56use serde:: { Deserialize , Serialize } ;
67
7- #[ derive( Default , Clone , Debug , PartialEq , Serialize , Deserialize ) ]
8+ const MAX_VALUE_LENGTH_FOR_DEBUG : usize = 1024 ;
9+
10+ #[ derive( Default , Clone , PartialEq , Serialize , Deserialize ) ]
811#[ serde( transparent) ]
912pub struct Any ( #[ serde( with = "ProtoAnyDef" ) ] ProtoAny ) ;
1013
@@ -18,6 +21,24 @@ impl Any {
1821 }
1922}
2023
24+ impl Debug for Any {
25+ fn fmt ( & self , f : & mut Formatter < ' _ > ) -> DebugResult {
26+ let mut debug = f. debug_struct ( "Any" ) ;
27+ debug. field ( "type_url" , & self . type_url ) ;
28+ if self . value . len ( ) > MAX_VALUE_LENGTH_FOR_DEBUG {
29+ debug
30+ . field ( "total_value_size" , & self . value . len ( ) )
31+ . field (
32+ & format ! ( "first_{}_value" , MAX_VALUE_LENGTH_FOR_DEBUG ) ,
33+ & & self . value [ ..MAX_VALUE_LENGTH_FOR_DEBUG ] ,
34+ ) ;
35+ } else {
36+ debug. field ( "value" , & self . value ) ;
37+ }
38+ debug. finish ( )
39+ }
40+ }
41+
2142impl Deref for Any {
2243 type Target = ProtoAny ;
2344
@@ -111,4 +132,42 @@ mod tests {
111132 assert_eq!( any1, any3) ;
112133 }
113134 }
135+
136+ #[ test]
137+ fn test_debug_any ( ) {
138+ let type_url = "type_url" . to_string ( ) ;
139+ let base = Any :: new ( type_url. clone ( ) , [ 0u8 ; MAX_VALUE_LENGTH_FOR_DEBUG ] . to_vec ( ) ) ;
140+ let base_str = format ! ( "{:?}" , base) ;
141+ {
142+ let value = [ 0u8 ; MAX_VALUE_LENGTH_FOR_DEBUG + 1 ] . to_vec ( ) ;
143+ let value_str = format ! ( "{:?}" , Any :: new( type_url. clone( ) , value) ) ;
144+ let expected_str = base_str. replace (
145+ "value" ,
146+ & format ! (
147+ "total_value_size: {}, first_{}_value" ,
148+ MAX_VALUE_LENGTH_FOR_DEBUG + 1 ,
149+ MAX_VALUE_LENGTH_FOR_DEBUG
150+ ) ,
151+ ) ;
152+ assert_eq ! ( value_str, expected_str) ;
153+ }
154+ {
155+ let value = [ 0u8 ; MAX_VALUE_LENGTH_FOR_DEBUG ] . to_vec ( ) ;
156+ assert_eq ! ( base_str, format!( "{:?}" , Any :: new( type_url. clone( ) , value) ) ) ;
157+ }
158+ {
159+ let value = [ 0u8 ; MAX_VALUE_LENGTH_FOR_DEBUG - 1 ] . to_vec ( ) ;
160+ let value_str = format ! ( "{:?}" , Any :: new( type_url. clone( ) , value) ) ;
161+ let unexpected_str = base_str. replace (
162+ "value" ,
163+ & format ! (
164+ "total_value_size: {}, first_{}_value" ,
165+ MAX_VALUE_LENGTH_FOR_DEBUG - 1 ,
166+ MAX_VALUE_LENGTH_FOR_DEBUG
167+ ) ,
168+ ) ;
169+ assert_ne ! ( base_str, value_str) ;
170+ assert_ne ! ( value_str, unexpected_str) ;
171+ }
172+ }
114173}
0 commit comments