@@ -27,80 +27,142 @@ trait MapShapedCsvRowDecoder[Repr] extends CsvRowDecoder[Repr, String]
27
27
28
28
object MapShapedCsvRowDecoder extends LowPriorityMapShapedCsvRowDecoder1 {
29
29
30
- implicit def hnilRowDecoder [Wrapped ]: WithDefaults [Wrapped , HNil , HNil , HNil ] =
31
- new WithDefaults [Wrapped , HNil , HNil , HNil ] {
32
- def fromWithDefault (row : CsvRow [String ], default : HNil , annotation : HNil ): DecoderResult [HNil ] =
33
- Right (HNil )
34
- }
30
+ implicit def hnilRowDecoder [Wrapped ]: WithDefaults [Wrapped , HNil , HNil , HNil , HNil ] =
31
+ (_ : CsvRow [String ], _ : HNil , _ : HNil , _ : HNil ) => Right (HNil )
35
32
36
33
implicit def optionHconsRowDecoder [Wrapped ,
37
34
Key <: Symbol ,
38
35
Head ,
39
36
Tail <: HList ,
40
37
DefaultTail <: HList ,
41
- Anno ,
42
- AnnoTail <: HList ](implicit
38
+ Name ,
39
+ NamesTail <: HList ,
40
+ EmbedTail <: HList ](implicit
43
41
witness : Witness .Aux [Key ],
44
42
Head : CellDecoder [Head ],
45
- ev : <:< [Anno , Option [CsvName ]],
46
- Tail : Lazy [WithDefaults [Wrapped , Tail , DefaultTail , AnnoTail ]])
43
+ ev : <:< [Name , Option [CsvName ]],
44
+ Tail : Lazy [WithDefaults [Wrapped , Tail , DefaultTail , NamesTail , EmbedTail ]])
47
45
: WithDefaults [Wrapped ,
48
46
FieldType [Key , Option [Head ]] :: Tail ,
49
47
Option [Option [Head ]] :: DefaultTail ,
50
- Anno :: AnnoTail ] =
51
- new WithDefaults [Wrapped ,
48
+ Name :: NamesTail ,
49
+ None .type :: EmbedTail ] =
50
+ (row : CsvRow [String ],
51
+ default : Option [Option [Head ]] :: DefaultTail ,
52
+ names : Name :: NamesTail ,
53
+ embeds : None .type :: EmbedTail ) => {
54
+ val head = row(names.head.fold(witness.value.name)(_.name)) match {
55
+ case Some (head) if head.nonEmpty => Head (head).map(Some (_))
56
+ case _ => Right (default.head.flatten)
57
+ }
58
+ for {
59
+ head <- head
60
+ tail <- Tail .value.fromWithDefault(row, default.tail, names.tail, embeds.tail)
61
+ } yield field[Key ](head) :: tail
62
+ }
63
+
64
+ implicit def optionHconsEmbedRowDecoder [Wrapped ,
65
+ Key <: Symbol ,
66
+ Head ,
67
+ Tail <: HList ,
68
+ DefaultTail <: HList ,
69
+ NamesTail <: HList ,
70
+ EmbedTail <: HList ](implicit
71
+ witness : Witness .Aux [Key ],
72
+ Head : CsvRowDecoder [Option [Head ], String ],
73
+ Tail : Lazy [WithDefaults [Wrapped , Tail , DefaultTail , NamesTail , EmbedTail ]])
74
+ : WithDefaults [Wrapped ,
52
75
FieldType [Key , Option [Head ]] :: Tail ,
53
76
Option [Option [Head ]] :: DefaultTail ,
54
- Anno :: AnnoTail ] {
55
- def fromWithDefault (row : CsvRow [String ],
56
- default : Option [Option [Head ]] :: DefaultTail ,
57
- anno : Anno :: AnnoTail ): DecoderResult [FieldType [Key , Option [Head ]] :: Tail ] = {
58
- val head = row(anno.head.fold(witness.value.name)(_.name)) match {
59
- case Some (head) if head.nonEmpty => Head (head).map(Some (_))
60
- case _ => Right (default.head.flatten)
77
+ None .type :: NamesTail ,
78
+ Some [CsvEmbed ] :: EmbedTail ] =
79
+ (row : CsvRow [String ],
80
+ default : Option [Option [Head ]] :: DefaultTail ,
81
+ names : None .type :: NamesTail ,
82
+ embeds : Some [CsvEmbed ] :: EmbedTail ) => {
83
+ for {
84
+ head <- (Head (row), default.head) match {
85
+ case (r @ Right (_), _) => r
86
+ case (Left (_ : DecoderError .ColumnMissing ), Some (default)) => Right (default)
87
+ case (Left (_ : DecoderError .ColumnMissing ), None ) => Right (None )
88
+ case (l @ Left (_), _) => l
61
89
}
62
- for {
63
- head <- head
64
- tail <- Tail .value.fromWithDefault(row, default.tail, anno.tail)
65
- } yield field[Key ](head) :: tail
66
- }
90
+ tail <- Tail .value.fromWithDefault(row, default.tail, names.tail, embeds.tail)
91
+ } yield field[Key ](head) :: tail
67
92
}
68
93
69
94
}
70
95
71
96
trait LowPriorityMapShapedCsvRowDecoder1 {
72
97
73
- trait WithDefaults [Wrapped , Repr , DefaultRepr , AnnoRepr ] {
74
- def fromWithDefault (row : CsvRow [String ], default : DefaultRepr , annotation : AnnoRepr ): DecoderResult [Repr ]
98
+ trait WithDefaults [Wrapped , Repr , DefaultRepr , NameAnno , EmbedAnno ] {
99
+ def fromWithDefault (row : CsvRow [String ],
100
+ default : DefaultRepr ,
101
+ names : NameAnno ,
102
+ embeds : EmbedAnno ): DecoderResult [Repr ]
75
103
}
76
104
77
105
implicit def hconsRowDecoder [Wrapped ,
78
106
Key <: Symbol ,
79
107
Head ,
80
108
Tail <: HList ,
81
109
DefaultTail <: HList ,
82
- Anno ,
83
- AnnoTail <: HList ](implicit
110
+ Name ,
111
+ NamesTail <: HList ,
112
+ EmbedTail <: HList ](implicit
84
113
witness : Witness .Aux [Key ],
85
114
Head : CellDecoder [Head ],
86
- ev : <:< [Anno , Option [CsvName ]],
87
- Tail : Lazy [WithDefaults [Wrapped , Tail , DefaultTail , AnnoTail ]])
88
- : WithDefaults [Wrapped , FieldType [ Key , Head ] :: Tail , Option [ Head ] :: DefaultTail , Anno :: AnnoTail ] =
89
- new WithDefaults [ Wrapped , FieldType [Key , Head ] :: Tail , Option [ Head ] :: DefaultTail , Anno :: AnnoTail ] {
90
- def fromWithDefault ( row : CsvRow [ String ] ,
91
- default : Option [ Head ] :: DefaultTail ,
92
- anno : Anno :: AnnoTail ) : DecoderResult [ FieldType [ Key , Head ] :: Tail ] = {
93
- val head = row(anno.head.fold(witness.value.name)(_.name)) match {
94
- case Some (head) if head.nonEmpty =>
95
- Head (head)
96
- case _ =>
97
- default .head.liftTo[ DecoderResult ]( new DecoderError ( s " unknown column name ' ${ witness.value.name} ' " ))
98
- }
99
- for {
100
- head <- head
101
- tail <- Tail .value.fromWithDefault(row, default.tail, anno.tail)
102
- } yield field[ Key ](head) :: tail
115
+ ev : <:< [Name , Option [CsvName ]],
116
+ Tail : Lazy [WithDefaults [Wrapped , Tail , DefaultTail , NamesTail , EmbedTail ]])
117
+ : WithDefaults [Wrapped ,
118
+ FieldType [Key , Head ] :: Tail ,
119
+ Option [ Head ] :: DefaultTail ,
120
+ Name :: NamesTail ,
121
+ None . type :: EmbedTail ] =
122
+ ( row : CsvRow [ String ],
123
+ default : Option [ Head ] :: DefaultTail ,
124
+ names : Name :: NamesTail ,
125
+ embeds : None . type :: EmbedTail ) => {
126
+ val head = row(names .head.fold( witness.value.name)(_.name)) match {
127
+ case Some (head) if head.nonEmpty =>
128
+ Head (head)
129
+ case _ =>
130
+ default.head.liftTo[ DecoderResult ](
131
+ new DecoderError . ColumnMissing ( s " unknown column name ' ${witness.value.name} ' " ))
103
132
}
133
+ for {
134
+ head <- head
135
+ tail <- Tail .value.fromWithDefault(row, default.tail, names.tail, embeds.tail)
136
+ } yield field[Key ](head) :: tail
137
+ }
138
+
139
+ implicit def hconsEmbedRowDecoder [Wrapped ,
140
+ Key <: Symbol ,
141
+ Head ,
142
+ Tail <: HList ,
143
+ DefaultTail <: HList ,
144
+ NamesTail <: HList ,
145
+ EmbedTail <: HList ](implicit
146
+ witness : Witness .Aux [Key ],
147
+ Head : CsvRowDecoder [Head , String ],
148
+ Tail : Lazy [WithDefaults [Wrapped , Tail , DefaultTail , NamesTail , EmbedTail ]])
149
+ : WithDefaults [Wrapped ,
150
+ FieldType [Key , Head ] :: Tail ,
151
+ Option [Head ] :: DefaultTail ,
152
+ None .type :: NamesTail ,
153
+ Some [CsvEmbed ] :: EmbedTail ] =
154
+ (row : CsvRow [String ],
155
+ default : Option [Head ] :: DefaultTail ,
156
+ names : None .type :: NamesTail ,
157
+ embeds : Some [CsvEmbed ] :: EmbedTail ) => {
158
+ for {
159
+ head <- (Head (row), default.head) match {
160
+ case (r @ Right (_), _) => r
161
+ case (Left (_ : DecoderError .ColumnMissing ), Some (default)) => Right (default)
162
+ case (l @ Left (_), _) => l
163
+ }
164
+ tail <- Tail .value.fromWithDefault(row, default.tail, names.tail, embeds.tail)
165
+ } yield field[Key ](head) :: tail
104
166
}
105
167
106
168
}
0 commit comments