1+ using System ;
2+ using Newtonsoft . Json ;
3+ using Newtonsoft . Json . Converters ;
4+ using System . IO ;
5+ using System . Text . RegularExpressions ;
6+
7+ namespace Nest . Resolvers . Converters
8+ {
9+ public class GeoPrecisionConverter : JsonConverter
10+ {
11+ private static readonly Regex SplitRegex = new Regex ( @"^(\d+(?:[.,]\d+)?)(\D+)$" ) ;
12+ public override void WriteJson ( JsonWriter writer , object value , JsonSerializer serializer )
13+ {
14+ var p = value as GeoPrecision ;
15+ if ( p == null )
16+ {
17+ writer . WriteNull ( ) ;
18+ return ;
19+ }
20+ using ( var sw = new StringWriter ( ) )
21+ using ( var localWriter = new JsonTextWriter ( sw ) )
22+ {
23+ serializer . Serialize ( localWriter , p . Precision ) ;
24+ localWriter . WriteRaw ( p . Unit . GetStringValue ( ) ) ;
25+ var s = sw . ToString ( ) ;
26+ writer . WriteValue ( s ) ;
27+ }
28+ }
29+
30+ public override object ReadJson ( JsonReader reader , Type objectType , object existingValue , JsonSerializer serializer )
31+ {
32+ if ( reader . TokenType != JsonToken . String ) return null ;
33+ var v = reader . Value as string ;
34+ if ( v == null ) return null ;
35+ var matches = SplitRegex . Matches ( v ) ;
36+ if ( matches . Count < 0
37+ || matches [ 0 ] . Groups . Count < 3 )
38+ return null ;
39+ double p ;
40+ var sp = matches [ 0 ] . Groups [ 1 ] . Captures [ 0 ] . Value ;
41+ if ( ! double . TryParse ( sp , out p ) ) return null ;
42+ var unit = matches [ 0 ] . Groups [ 2 ] . Captures [ 0 ] . Value . ToEnum < GeoPrecisionUnit > ( ) ;
43+ if ( ! unit . HasValue ) return null ;
44+ return new GeoPrecision ( p , unit . Value ) ;
45+ }
46+
47+ public override bool CanConvert ( Type objectType )
48+ {
49+ return true ;
50+ }
51+ }
52+ }
0 commit comments