11use std:: collections:: HashMap ;
22use std:: iter:: once;
3+ use std:: num:: NonZero ;
34use std:: sync:: Arc ;
45
56use anyhow:: { Context , Result } ;
67use nuts_storable:: { ItemType , Value } ;
78use zarrs:: array:: { ArrayBuilder , DataType , FillValue } ;
89use zarrs:: array_subset:: ArraySubset ;
910use zarrs:: group:: GroupBuilder ;
11+ use zarrs:: metadata_ext:: data_type:: NumpyTimeUnit ;
1012use zarrs:: storage:: { ReadableWritableListableStorage , ReadableWritableListableStorageTraits } ;
1113
1214use super :: common:: { Chunk , SampleBuffer , SampleBufferValue } ;
@@ -37,7 +39,38 @@ pub fn store_coords(
3739 & Value :: I64 ( ref v) => ( DataType :: Int64 , v. len ( ) , FillValue :: from ( 0i64 ) ) ,
3840 & Value :: Bool ( ref v) => ( DataType :: Bool , v. len ( ) , FillValue :: from ( false ) ) ,
3941 & Value :: Strings ( ref v) => ( DataType :: String , v. len ( ) , FillValue :: from ( "" ) ) ,
40- _ => panic ! ( "Unsupported coordinate type for {}" , name) ,
42+ & Value :: DateTime64 ( ref unit, ref data) => (
43+ DataType :: NumpyDateTime64 {
44+ unit : match unit {
45+ nuts_storable:: DateTimeUnit :: Seconds => NumpyTimeUnit :: Second ,
46+ nuts_storable:: DateTimeUnit :: Milliseconds => NumpyTimeUnit :: Millisecond ,
47+ nuts_storable:: DateTimeUnit :: Microseconds => NumpyTimeUnit :: Microsecond ,
48+ nuts_storable:: DateTimeUnit :: Nanoseconds => NumpyTimeUnit :: Nanosecond ,
49+ } ,
50+ scale_factor : NonZero :: new ( 1 ) . unwrap ( ) ,
51+ } ,
52+ data. len ( ) ,
53+ FillValue :: new_null ( ) ,
54+ ) ,
55+ & Value :: TimeDelta64 ( ref unit, ref data) => (
56+ DataType :: NumpyTimeDelta64 {
57+ unit : match unit {
58+ nuts_storable:: DateTimeUnit :: Seconds => NumpyTimeUnit :: Second ,
59+ nuts_storable:: DateTimeUnit :: Milliseconds => NumpyTimeUnit :: Millisecond ,
60+ nuts_storable:: DateTimeUnit :: Microseconds => NumpyTimeUnit :: Microsecond ,
61+ nuts_storable:: DateTimeUnit :: Nanoseconds => NumpyTimeUnit :: Nanosecond ,
62+ } ,
63+ scale_factor : NonZero :: new ( 1 ) . unwrap ( ) ,
64+ } ,
65+ data. len ( ) ,
66+ FillValue :: new_null ( ) ,
67+ ) ,
68+ _ => {
69+ return Err ( anyhow:: anyhow!(
70+ "Unsupported coordinate type for coordinate {}" ,
71+ name
72+ ) ) ;
73+ }
4174 } ;
4275 let name: & String = name;
4376
@@ -53,6 +86,12 @@ pub fn store_coords(
5386 & Value :: I64 ( ref v) => coord_array. store_chunk_elements :: < i64 > ( & subset, v) ?,
5487 & Value :: Bool ( ref v) => coord_array. store_chunk_elements :: < bool > ( & subset, v) ?,
5588 & Value :: Strings ( ref v) => coord_array. store_chunk_elements :: < String > ( & subset, v) ?,
89+ & Value :: DateTime64 ( _, ref data) => {
90+ coord_array. store_chunk_elements :: < i64 > ( & subset, data) ?
91+ }
92+ & Value :: TimeDelta64 ( _, ref data) => {
93+ coord_array. store_chunk_elements :: < i64 > ( & subset, data) ?
94+ }
5695 _ => unreachable ! ( ) ,
5796 }
5897 coord_array. store_metadata ( ) ?;
0 commit comments