-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
79 lines (70 loc) · 2.16 KB
/
main.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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package kokkaiapi
import (
"context"
"iter"
)
type Request[T result] struct {
Client Client[T]
Generator Generator
}
var (
//「会議単位簡易出力」を取得するリクエスト構造体
DefaultKaniRequest = Request[*KaniResult]{
Client: KaniClient,
Generator: KaniURI,
}
//「会議単位出力」を取得するリクエスト構造体
DefaultKaigiRequest = Request[*KaigiResult]{
Client: KaigiClient,
Generator: KaigiURI,
}
//「発言単位出力」を取得するリクエスト構造体
DefaultHatsugenRequest = Request[*HatsugenResult]{
Client: HatsugenClient,
Generator: HatsugenURI,
}
)
// 「会議単位簡易出力」で議事録を再帰的に取得します。
//
// 引数に最初の検索条件を指定します。
func IterKaniResult(p Param) iter.Seq2[*KaniResult, error] {
return IterResult(p, DefaultKaniRequest)
}
// 「会議単位出力」で議事録を再帰的に取得します。
//
// 引数に最初の検索条件を指定します。
func IterKaigiResult(p Param) iter.Seq2[*KaigiResult, error] {
return IterResult(p, DefaultKaigiRequest)
}
// 「発言単位出力」で議事録を再帰的に取得します。
//
// 引数に最初の検索条件を指定します。
func IterHatsugenResult(p Param) iter.Seq2[*HatsugenResult, error] {
return IterResult(p, DefaultHatsugenRequest)
}
// 任意のリクエスト構造体から再帰的に議事録を取得します。
func IterResult[T result](p Param, r Request[T]) iter.Seq2[T, error] {
return func(yield func(T, error) bool) {
nextPosCh := make(chan int, 1)
ctx, cancel := context.WithCancel(context.Background())
defer close(nextPosCh)
defer cancel()
uriIter := r.Generator.Generate(ctx, p, nextPosCh)
for val, err := range r.Client.IterRequest(ctx, uriIter) {
if ok := yield(val, err); !ok {
break
}
p := val.getNextRecordPosition()
if p > 0 {
nextPosCh <- p
} else {
return
}
}
}
}
// 任意のリクエスト構造体から議事録を取得する。
func GetResult[T result](p Param, r Request[T]) (T, error) {
uri := ConstructURI(string(r.Generator), p)
return r.Client.DoRequest(context.Background(), uri)
}