66 lines
4 KiB
Markdown
66 lines
4 KiB
Markdown
## ciletters
|
||
|
||
В этой задаче вам предстоит познакомиться со стандартным пакетом [text/template](https://golang.org/pkg/text/template/),
|
||
позволяющим генерировать текст в определенном формате, а также с пакетом [embed](https://pkg.go.dev/embed),
|
||
позволяющим вкомпиливать в исполняемый файл строковые литералы.
|
||
|
||
### Легенда
|
||
|
||
В gitlab можно подписаться на различные события: успешный build, новый комментарий, решённое issue и др.
|
||
Вот так, например, выглядит нотификация о сломанном pipeline'е:
|
||
|
||
![Image description](assets/notification.png)
|
||
|
||
В задаче предлагается сгенерировать письмо подобного содержания в текстовом виде.
|
||
|
||
Для генерации HTML в языке также имеется стандартный пакет [html/template](https://golang.org/pkg/html/template/).
|
||
Работа с ним аналогична работе с `text/template`, поэтому для простоты в задаче был выбран текстовый формат.
|
||
|
||
### Что нужно сделать?
|
||
|
||
Нужно реализовать функцию `MakeLetter` из файла [letter.go](./letter.go),
|
||
которая по go объекту нотификации генерирует её текстовое представление.
|
||
|
||
Для этого нужно написать `text/template` шаблон, сохранить его в отдельный файл, а затем получить его содержимое в коде с помомщью `go:embed`.
|
||
|
||
#### Прокомментированный пример из теста
|
||
```
|
||
Your pipeline #194613 has failed! // 194613 -- это ID pipeline'а
|
||
Project: go-spring-2021/gopher // Project состоит из ID группы и ID проекта
|
||
Branch: 🌿 master
|
||
Commit: 8967153e Solve urlfetch. // Первые 8 байт хэша коммита.
|
||
CommitAuthor: gopher
|
||
// Здесь происходит цикл по всем сломанным job'ам
|
||
Stage: test, Job grade // test -- это имя stage'а, а grade -- имя job'а
|
||
// Далее идут последние 10 строк лога gitlab runner'а
|
||
testtool: copying go.mod, go.sum and .golangci.yml
|
||
testtool: running tests
|
||
testtool: > go test -mod readonly -tags private -c -o /tmp/bincache730817117/5d83984f885e61c1 gitlab.com/manytask/itmo-go/private/sum
|
||
--- FAIL: TestSum (0.00s)
|
||
sum_test.go:19: 2 + 2 == 0 != 4
|
||
sum_test.go:19: 9223372036854775807 + 1 == 0 != -9223372036854775808
|
||
FAIL
|
||
testtool: task sum failed: test failed: exit status 1
|
||
some tasks failed
|
||
ERROR: Job failed: exit code 1
|
||
```
|
||
|
||
Объект нотификации описан в [notification.go](notification.go).
|
||
Обратите внимание на `//go:build !change`.
|
||
Этот файл менять не нужно, и на сервере будет использоваться оригинальный вариант.
|
||
|
||
В реализации нужно подогнать `text/template` шаблон под требуемый вывод. Функция должна использовать один шаблон.
|
||
Использовать `fmt.Sprintf` или конкатенацию строк нельзя.
|
||
|
||
Вам могут понадобиться:
|
||
* условные блоки (`if/else`)
|
||
* range'и
|
||
* кастомные функции в шаблоне: https://golang.org/pkg/text/template/#FuncMap
|
||
* `'-'` для удаления пробелов
|
||
|
||
### Проверка решения
|
||
|
||
Для запуска тестов нужно выполнить следующую команду:
|
||
```
|
||
go test -v ./ciletters/...
|
||
```
|