@@ -31,49 +31,28 @@ fn get_file_bytes(safetensors_path: &str) -> Vec<u8> {
31
31
fs:: read ( safetensors_path) . unwrap ( )
32
32
}
33
33
34
- fn dicom_values_to_vec ( tag : & str , dicom_values : & [ DicomValue ] ) -> Option < Vec < u8 > > {
34
+ fn dicom_values_to_vec ( tag : & str , dicom_values : & DicomValue ) -> Option < Vec < u8 > > {
35
35
let field_bytes = match dicom_values {
36
- [ DicomValue :: String ( s) ] => to_vec ( & s) ,
37
- [ DicomValue :: Integer ( u) ] => to_vec ( & u) ,
38
- [ DicomValue :: Float ( u) ] => to_vec ( & u) ,
39
- [ DicomValue :: Alphabetic ( u) ] => to_vec ( & u. alphabetic ) ,
40
- many => match many
41
- . first ( )
42
- . expect ( "This should definitely have a first element" )
43
- {
44
- DicomValue :: String ( _) => to_vec (
45
- & many
46
- . iter ( )
47
- . map ( |v| match v {
48
- DicomValue :: String ( s) => s. to_owned ( ) ,
49
- _ => panic ! ( "{tag} expected only strings" ) ,
50
- } )
51
- . collect :: < Vec < String > > ( ) ,
52
- ) ,
53
- DicomValue :: Integer ( _) => to_vec (
54
- & many
55
- . iter ( )
56
- . map ( |v| match v {
57
- DicomValue :: Integer ( i) => * i,
58
- _ => panic ! ( "{tag} expected only ints" ) ,
59
- } )
60
- . collect :: < Vec < i64 > > ( ) ,
61
- ) ,
62
- DicomValue :: Float ( _) => to_vec (
63
- & many
64
- . iter ( )
65
- . map ( |v| match v {
66
- DicomValue :: Float ( f) => * f,
67
- _ => panic ! ( "{tag} expected only floats" ) ,
68
- } )
69
- . collect :: < Vec < f64 > > ( ) ,
70
- ) ,
71
- DicomValue :: SeqField ( _) => {
72
- // TODO: handle sequences of sequences properly
73
- return None ;
74
- }
75
- other => panic ! ( "{tag} unexpected value type {:?}" , other) ,
36
+ DicomValue :: String ( v) => match & * * v {
37
+ [ s] => to_vec ( & s) ,
38
+ o => to_vec ( o) ,
39
+ } ,
40
+ DicomValue :: Integer ( v) => match & * * v {
41
+ [ u] => to_vec ( & u) ,
42
+ o => to_vec ( o) ,
76
43
} ,
44
+ DicomValue :: Float ( v) => match & * * v {
45
+ [ u] => to_vec ( & u) ,
46
+ o => to_vec ( o) ,
47
+ } ,
48
+ DicomValue :: Alphabetic ( v) => match & * * v {
49
+ [ u] => to_vec ( & u. alphabetic ) ,
50
+ _ => panic ! ( "{tag} can't have more than one Alphabetic" ) ,
51
+ } ,
52
+ DicomValue :: SeqField ( _) => {
53
+ // TODO: handle sequences of sequences properly
54
+ return None ;
55
+ }
77
56
} ;
78
57
let field_bytes = field_bytes. unwrap ( ) ;
79
58
Some ( field_bytes)
@@ -107,13 +86,23 @@ fn prepare_dimble_field(
107
86
vr,
108
87
inline_binary : None ,
109
88
} => {
110
- match value. as_slice ( ) {
111
- [ ] if vr == b"SQ" => Ok ( HeaderField :: SQ ( vec ! [ ] ) ) ,
112
- [ ] => panic ! ( "empty value" ) ,
113
- [ DicomValue :: SeqField ( seq) ] => {
114
- let sq_header_field_map =
115
- prepare_dimble_fields ( seq, data_bytes, pixel_array_safetensors_path) ?;
116
- Ok ( HeaderField :: SQ ( vec ! [ sq_header_field_map] ) )
89
+ if value. is_empty ( ) {
90
+ if vr == b"SQ" {
91
+ return Ok ( HeaderField :: SQ ( vec ! [ ] ) ) ;
92
+ }
93
+ panic ! ( "empty value" ) ;
94
+ }
95
+
96
+ match value {
97
+ DicomValue :: SeqField ( seqs) => {
98
+ let seqs = seqs
99
+ . iter ( )
100
+ . map ( |seq| {
101
+ prepare_dimble_fields ( seq, data_bytes, pixel_array_safetensors_path)
102
+ } )
103
+ . collect :: < InnerResult < _ , _ > > ( ) ?;
104
+
105
+ Ok ( HeaderField :: SQ ( seqs) )
117
106
}
118
107
dicom_values => {
119
108
// call a function to handle this
@@ -335,29 +324,23 @@ mod tests {
335
324
{
336
325
let field = ir. get ( "00080005" ) . expect ( "expected 00080005 to exist" ) ;
337
326
assert_eq ! ( field. vr, * b"CS" ) ;
338
- let value: Vec < _ > = field
327
+ let value = field
339
328
. value
340
- . iter ( )
341
- . map ( |v| match v. as_slice ( ) {
342
- [ DicomValue :: String ( s) ] => s,
343
- _ => panic ! ( "expected only strings" ) ,
344
- } )
345
- . collect ( ) ;
329
+ . as_ref ( )
330
+ . unwrap ( )
331
+ . to_string_ref ( )
332
+ . expect ( "expected only strings" ) ;
346
333
assert_eq ! ( value, [ "ISO_IR 100" ] )
347
334
}
348
335
{
349
336
let field = ir. get ( "00080008" ) . expect ( "expected 00080008 to exist" ) ;
350
337
assert_eq ! ( field. vr, * b"CS" ) ;
351
- let value: Vec < _ > = field
338
+ let value = field
352
339
. value
353
340
. as_ref ( )
354
341
. unwrap ( )
355
- . iter ( )
356
- . map ( |v| match v {
357
- DicomValue :: String ( s) => s,
358
- _ => panic ! ( "expected only strings" ) ,
359
- } )
360
- . collect ( ) ;
342
+ . to_string_ref ( )
343
+ . expect ( "expected only strings" ) ;
361
344
assert_eq ! ( value, [ "ORIGINAL" , "PRIMARY" , "OTHER" ] ) ;
362
345
}
363
346
{
@@ -368,17 +351,14 @@ mod tests {
368
351
{
369
352
let field = ir. get ( "00100010" ) . expect ( "expected 00100010 to exist" ) ;
370
353
assert_eq ! ( field. vr, * b"PN" ) ;
371
- let value: Vec < _ > = field
354
+ let value = field
372
355
. value
373
356
. as_ref ( )
374
357
. unwrap ( )
375
- . iter ( )
376
- . map ( |v| match v {
377
- DicomValue :: Alphabetic ( a) => & a. alphabetic ,
378
- _ => panic ! ( "expected only alphabetic" ) ,
379
- } )
380
- . collect ( ) ;
381
- assert_eq ! ( value, [ "Doe^John" ] )
358
+ . to_alphabetic_ref ( )
359
+ . expect ( "expected only alphabetic" ) ;
360
+ let value = value. iter ( ) . map ( |x| & x. alphabetic ) . collect :: < Vec < _ > > ( ) ;
361
+ assert_eq ! ( value, & [ "Doe^John" ] )
382
362
}
383
363
384
364
Ok ( ( ) )
0 commit comments