@@ -163,7 +163,7 @@ read_rust!(dmap);
163163/// Generates two functions: `read_[type]` and `read_[type]_lax`, for strict and lax
164164/// reading, respectively.
165165macro_rules! read_py {
166- ( $name: ident, $py_name: literal, $lax_name: literal, $bytes_name: literal, $lax_bytes_name: literal) => {
166+ ( $name: ident, $py_name: literal, $lax_name: literal, $bytes_name: literal, $lax_bytes_name: literal, $sniff_name : literal ) => {
167167 paste! {
168168 #[ doc = "Reads a `" $name: upper "` file, returning a list of dictionaries containing the fields." ]
169169 #[ pyfunction]
@@ -219,29 +219,42 @@ macro_rules! read_py {
219219 result. 1 ,
220220 ) )
221221 }
222+
223+ #[ doc = "Reads a `" $name: upper "` file, returning the first record." ]
224+ #[ pyfunction]
225+ #[ pyo3( name = $sniff_name) ]
226+ #[ pyo3( text_signature = "(infile: str, /)" ) ]
227+ fn [ < sniff_ $name _py >] ( infile: PathBuf ) -> PyResult <IndexMap <String , DmapField >> {
228+ Ok ( [ < $name: camel Record >] :: sniff_file( & infile)
229+ . map_err( PyErr :: from) ?
230+ . inner( )
231+ )
232+ }
222233 }
223234 }
224235}
225236
226- read_py ! ( iqdat, "read_iqdat" , "read_iqdat_lax" , "read_iqdat_bytes" , "read_iqdat_bytes_lax" ) ;
237+ read_py ! ( iqdat, "read_iqdat" , "read_iqdat_lax" , "read_iqdat_bytes" , "read_iqdat_bytes_lax" , "sniff_iqdat" ) ;
227238read_py ! (
228239 rawacf,
229240 "read_rawacf" ,
230241 "read_rawacf_lax" ,
231242 "read_rawacf_bytes" ,
232- "read_rawacf_bytes_lax"
243+ "read_rawacf_bytes_lax" ,
244+ "sniff_rawacf"
233245) ;
234246read_py ! (
235247 fitacf,
236248 "read_fitacf" ,
237249 "read_fitacf_lax" ,
238250 "read_fitacf_bytes" ,
239- "read_fitacf_bytes_lax"
251+ "read_fitacf_bytes_lax" ,
252+ "sniff_fitacf"
240253) ;
241- read_py ! ( grid, "read_grid" , "read_grid_lax" , "read_grid_bytes" , "read_grid_bytes_lax" ) ;
242- read_py ! ( map, "read_map" , "read_map_lax" , "read_map_bytes" , "read_map_bytes_lax" ) ;
243- read_py ! ( snd, "read_snd" , "read_snd_lax" , "read_snd_bytes" , "read_snd_bytes_lax" ) ;
244- read_py ! ( dmap, "read_dmap" , "read_dmap_lax" , "read_dmap_bytes" , "read_dmap_bytes_lax" ) ;
254+ read_py ! ( grid, "read_grid" , "read_grid_lax" , "read_grid_bytes" , "read_grid_bytes_lax" , "sniff_grid" ) ;
255+ read_py ! ( map, "read_map" , "read_map_lax" , "read_map_bytes" , "read_map_bytes_lax" , "sniff_map" ) ;
256+ read_py ! ( snd, "read_snd" , "read_snd_lax" , "read_snd_bytes" , "read_snd_bytes_lax" , "sniff_snd" ) ;
257+ read_py ! ( dmap, "read_dmap" , "read_dmap_lax" , "read_dmap_bytes" , "read_dmap_bytes_lax" , "sniff_dmap" ) ;
245258
246259/// Checks that a list of dictionaries contains DMAP records, then appends to outfile.
247260///
@@ -359,5 +372,14 @@ fn dmap(m: &Bound<'_, PyModule>) -> PyResult<()> {
359372 m. add_function ( wrap_pyfunction ! ( write_grid_bytes_py, m) ?) ?;
360373 m. add_function ( wrap_pyfunction ! ( write_map_bytes_py, m) ?) ?;
361374
375+ // Sniff the first record
376+ m. add_function ( wrap_pyfunction ! ( sniff_dmap_py, m) ?) ?;
377+ m. add_function ( wrap_pyfunction ! ( sniff_iqdat_py, m) ?) ?;
378+ m. add_function ( wrap_pyfunction ! ( sniff_rawacf_py, m) ?) ?;
379+ m. add_function ( wrap_pyfunction ! ( sniff_fitacf_py, m) ?) ?;
380+ m. add_function ( wrap_pyfunction ! ( sniff_snd_py, m) ?) ?;
381+ m. add_function ( wrap_pyfunction ! ( sniff_grid_py, m) ?) ?;
382+ m. add_function ( wrap_pyfunction ! ( sniff_map_py, m) ?) ?;
383+
362384 Ok ( ( ) )
363385}
0 commit comments