-
Notifications
You must be signed in to change notification settings - Fork 7
/
Selector.go
34 lines (28 loc) · 912 Bytes
/
Selector.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package resource
// Filter filters for language and id to produce a list of matching resources.
type Filter interface {
Filter(lang Language, id ID) List
}
// Selector provides a merged view of resources according to a language.
type Selector struct {
// Lang specifies the language to filter by.
Lang Language
// From specifies from where the resources shall be taken.
From Filter
// As defines how the found resources should be viewed in case more than one matches.
// By default, the last resource will be used.
As ViewStrategy
}
// Select provides a collected view on one resource.
func (merger Selector) Select(id ID) (view View, err error) {
list := merger.From.Filter(merger.Lang, id)
if len(list) == 0 {
return nil, ErrNotFound(id)
}
if (merger.As == nil) || !merger.As.IsCompoundList(id) {
view = list[len(list)-1]
} else {
view = &listMerger{list: list}
}
return view, nil
}