/
flex.go
65 lines (54 loc) · 1.6 KB
/
flex.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
package linebot
import (
_ "embed"
"encoding/json"
"time"
"github.com/google/go-jsonnet"
"golang.org/x/xerrors"
"github.com/ww24/linebot/domain/model"
)
var (
//go:embed flex/reminder_list.jsonnet
reminderListMessage string
)
type ReminderItem struct {
Title string `json:"title"`
SubTitle string `json:"subTitle"`
Next string `json:"next"`
DeleteTarget string `json:"deleteTarget"`
}
func makeReminderListMessage(items []*model.ReminderItem, t time.Time) ([]byte, error) {
reminderItems := make([]*ReminderItem, 0, len(items))
for _, item := range items {
reminderItems = append(reminderItems, toReminderItem(item, t))
}
itemsJSON, err := json.Marshal(reminderItems)
if err != nil {
return nil, xerrors.Errorf("failed to marshal reminder items: %w", err)
}
vm := jsonnet.MakeVM()
vm.Importer(&jsonnet.MemoryImporter{
Data: map[string]jsonnet.Contents{
"reminder_list.json": jsonnet.MakeContents(string(itemsJSON)),
},
})
result, err := vm.EvaluateAnonymousSnippet("reminder_list.jsonnet", reminderListMessage)
if err != nil {
return nil, xerrors.Errorf("failed to evaluate jsonnet: %w", err)
}
return []byte(result), nil
}
func toReminderItem(item *model.ReminderItem, t time.Time) *ReminderItem {
var next string
if schedule, err := item.Scheduler.Next(t); err != nil {
next = "ERROR: failed to calculate next schedule"
} else {
next = schedule.Format("01/02 15:04")
}
return &ReminderItem{
Title: item.Executor.Type.UIText(),
SubTitle: item.Scheduler.UIText(),
Next: next,
DeleteTarget: "Reminder#delete#" + string(item.ID),
}
}