@@ -3,9 +3,6 @@ use std::{fmt, str};
33use serde:: { Deserialize , Serialize } ;
44use utoipa:: ToSchema ;
55
6- type Bbox2D = [ f64 ; 4 ] ;
7- type Bbox3D = [ f64 ; 6 ] ;
8-
96/// Each bounding box is provided as four or six numbers, depending on
107/// whether the coordinate reference system includes a vertical axis
118/// (height or depth):
@@ -41,9 +38,9 @@ type Bbox3D = [f64; 6];
4138#[ serde( untagged) ]
4239pub enum Bbox {
4340 #[ schema( value_type = Vec <f64 >) ]
44- Bbox2D ( Bbox2D ) ,
41+ Bbox2D ( [ f64 ; 4 ] ) ,
4542 #[ schema( value_type = Vec <f64 >) ]
46- Bbox3D ( Bbox3D ) ,
43+ Bbox3D ( [ f64 ; 6 ] ) ,
4744}
4845
4946impl fmt:: Display for Bbox {
@@ -79,10 +76,28 @@ impl str::FromStr for Bbox {
7976 fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
8077 let numbers: Vec < f64 > = s
8178 . split ( ',' )
82- . map ( |d| d. trim ( ) . parse :: < f64 > ( ) )
79+ . map ( |d| d. trim ( ) . trim_matches ( & [ '[' , ']' ] ) . parse :: < f64 > ( ) )
8380 . collect :: < Result < Vec < f64 > , std:: num:: ParseFloatError > > ( )
8481 . map_err ( |_| "Unable to convert bbox coordinates to float" ) ?;
8582
83+ let n = numbers. len ( ) ;
84+
85+ // check number of coordinates
86+ if !( n == 4 || n == 6 ) {
87+ return Err ( "Expected 4 or 6 numbers" ) ;
88+ }
89+
90+ // check lower <= upper on axis 2
91+ if ( n == 4 && numbers[ 1 ] > numbers[ 3 ] ) || ( n == 6 && numbers[ 1 ] > numbers[ 4 ] ) {
92+ // TODO: ensure this assumption is correct
93+ return Err ( "Lower value of coordinate axis 2 must be larger than upper value!" ) ;
94+ }
95+
96+ // check lower <= upper on axis 3
97+ if n == 6 && numbers[ 2 ] > numbers[ 5 ] {
98+ return Err ( "Lower value of coordinate axis 3 must be larger than upper value!" ) ;
99+ }
100+
86101 match numbers. len ( ) {
87102 4 => Ok ( Bbox :: Bbox2D ( [
88103 numbers[ 0 ] , numbers[ 1 ] , numbers[ 2 ] , numbers[ 3 ] ,
0 commit comments