1
- use cjseq:: { CityJSONFeature , Transform as CjTransform } ;
1
+ use cjseq:: { CityJSON , CityJSONFeature , Transform as CjTransform } ;
2
2
use clap:: { Parser , Subcommand } ;
3
3
use fcb_core:: error:: Error ;
4
4
use fcb_core:: {
@@ -12,7 +12,6 @@ use std::{
12
12
io:: { self , BufReader , BufWriter , Read , Write } ,
13
13
path:: PathBuf ,
14
14
} ;
15
-
16
15
#[ derive( Parser ) ]
17
16
#[ command( author, version, about = "CLI tool for CityJSON <-> FCB conversion" ) ]
18
17
struct Cli {
@@ -56,6 +55,26 @@ enum Commands {
56
55
output : String ,
57
56
} ,
58
57
58
+ /// Convert CityJSON to CBOR
59
+ Cbor {
60
+ /// Input file (use '-' for stdin)
61
+ #[ arg( short, long) ]
62
+ input : String ,
63
+ /// Output file (use '-' for stdout)
64
+ #[ arg( short, long) ]
65
+ output : String ,
66
+ } ,
67
+
68
+ /// Convert CityJSON to BSON
69
+ Bson {
70
+ /// Input file (use '-' for stdin)
71
+ #[ arg( short, long) ]
72
+ input : String ,
73
+ /// Output file (use '-' for stdout)
74
+ #[ arg( short, long) ]
75
+ output : String ,
76
+ } ,
77
+
59
78
/// Show info about FCB file
60
79
Info {
61
80
/// Input FCB file
@@ -323,6 +342,55 @@ fn deserialize(input: &str, output: &str) -> Result<(), Error> {
323
342
Ok ( ( ) )
324
343
}
325
344
345
+ fn encode_cbor ( input : & str , output : & str ) -> Result < ( ) , Error > {
346
+ let reader = BufReader :: new ( get_reader ( input) ?) ;
347
+ let writer = BufWriter :: new ( get_writer ( output) ?) ;
348
+
349
+ let value: serde_json:: Value = serde_json:: from_reader ( reader) ?;
350
+ serde_cbor:: to_writer ( writer, & value) . map_err ( |e| {
351
+ Error :: IoError ( std:: io:: Error :: new (
352
+ std:: io:: ErrorKind :: Other ,
353
+ format ! ( "failed to encode to cbor: {}" , e) ,
354
+ ) )
355
+ } ) ?;
356
+
357
+ if output != "-" {
358
+ eprintln ! ( "successfully encoded to cbor" ) ;
359
+ }
360
+ Ok ( ( ) )
361
+ }
362
+
363
+ fn encode_bson ( input : & str , output : & str ) -> Result < ( ) , Error > {
364
+ let mut reader = BufReader :: new ( get_reader ( input) ?) ;
365
+ let json_str = {
366
+ let mut s = String :: new ( ) ;
367
+ reader. read_to_string ( & mut s) ?;
368
+ s
369
+ } ;
370
+
371
+ let cityjson: CityJSON = serde_json:: from_str ( & json_str) ?;
372
+ let bson = bson:: to_bson ( & cityjson) . map_err ( |e| {
373
+ Error :: IoError ( std:: io:: Error :: new (
374
+ std:: io:: ErrorKind :: Other ,
375
+ format ! ( "failed to encode to bson: {}" , e) ,
376
+ ) )
377
+ } ) ?;
378
+ let doc = bson. as_document ( ) . unwrap ( ) ;
379
+
380
+ let mut writer = get_writer ( output) ?;
381
+ doc. to_writer ( & mut writer) . map_err ( |e| {
382
+ Error :: IoError ( std:: io:: Error :: new (
383
+ std:: io:: ErrorKind :: Other ,
384
+ format ! ( "failed to encode to bson: {}" , e) ,
385
+ ) )
386
+ } ) ?;
387
+
388
+ if output != "-" {
389
+ eprintln ! ( "successfully encoded to bson" ) ;
390
+ }
391
+ Ok ( ( ) )
392
+ }
393
+
326
394
fn show_info ( input : PathBuf ) -> Result < ( ) , Error > {
327
395
let reader = BufReader :: new ( File :: open ( input) ?) ;
328
396
let metadata = reader. get_ref ( ) . metadata ( ) ?. len ( ) / 1024 / 1024 ; // show in megabytes
@@ -386,6 +454,8 @@ fn main() -> Result<(), Error> {
386
454
ge,
387
455
} => serialize ( & input, & output, attr_index, bbox, ge) ,
388
456
Commands :: Deser { input, output } => deserialize ( & input, & output) ,
457
+ Commands :: Cbor { input, output } => encode_cbor ( & input, & output) ,
458
+ Commands :: Bson { input, output } => encode_bson ( & input, & output) ,
389
459
Commands :: Info { input } => show_info ( input) ,
390
460
}
391
461
}
0 commit comments