@@ -18,13 +18,11 @@ import (
18
18
type (
19
19
mountPointHost [T any ] interface {
20
20
* T
21
- p9fs.FieldParser
22
21
p9fs.Mounter
23
22
p9fs.HostIdentifier
24
23
}
25
24
mountPointGuest [T any ] interface {
26
25
* T
27
- p9fs.FieldParser
28
26
p9fs.SystemMaker
29
27
p9fs.GuestIdentifier
30
28
}
@@ -170,25 +168,44 @@ func (mp *mountPoint[HT, GT, HC, GC]) ParseField(key, value string) error {
170
168
guestPrefix = "guest."
171
169
)
172
170
var (
173
- prefix string
174
- parseFn func (_ , _ string ) error
171
+ prefix string
172
+ parser p9fs.FieldParser
173
+ )
174
+ const (
175
+ // TODO: [Go 1.21] use [errors.ErrUnsupported].
176
+ unsupported = generic .ConstError ("unsupported operation" )
177
+ unsupportedFmt = "%w: %T does not implement field parser"
175
178
)
176
179
switch {
177
180
case strings .HasPrefix (key , hostPrefix ):
178
181
prefix = hostPrefix
179
- parseFn = HC (& mp .Host ).ParseField
182
+ var ok bool
183
+ if parser , ok = any (& mp .Host ).(p9fs.FieldParser ); ! ok {
184
+ return fmt .Errorf (
185
+ unsupportedFmt ,
186
+ unsupported , & mp .Host ,
187
+ )
188
+ }
180
189
case strings .HasPrefix (key , guestPrefix ):
181
190
prefix = guestPrefix
182
- parseFn = GC (& mp .Guest ).ParseField
191
+ var ok bool
192
+ if parser , ok = any (& mp .Guest ).(p9fs.FieldParser ); ! ok {
193
+ return fmt .Errorf (
194
+ unsupportedFmt ,
195
+ unsupported , & mp .Guest ,
196
+ )
197
+ }
183
198
default :
184
199
const wildcard = "*"
185
200
return p9fs.FieldError {
186
201
Key : key ,
187
202
Tried : []string {hostPrefix + wildcard , guestPrefix + wildcard },
188
203
}
189
204
}
190
- baseKey := key [len (prefix ):]
191
- err := parseFn (baseKey , value )
205
+ var (
206
+ baseKey = key [len (prefix ):]
207
+ err = parser .ParseField (baseKey , value )
208
+ )
192
209
if err == nil {
193
210
return nil
194
211
}
0 commit comments