OnlineLibrary

Форк
0
79 строк · 1.5 Кб
1
package config
2

3
import (
4
	"errors"
5
	"time"
6

7
	"OnlineLibrary/internal/util"
8
)
9

10
var (
11
	BookNotFound      = errors.New("book not found")
12
	ListeningPosition = "listening_position"
13
)
14

15
type Bookmark struct {
16
	// Name of the bookmark. Reserved for future use
17
	Name string `yaml:"name,omitempty"`
18
	// Fragment of a book with the bookmark
19
	Fragment int `yaml:"fragment"`
20
	// Offset from the beginning of the fragment
21
	Position time.Duration `yaml:"position"`
22
}
23

24
type Book struct {
25
	// Unique ID of the book
26
	ID string `yaml:"id"`
27
	// Values for speed when playing the book
28
	Speed float64 `yaml:"speed,omitempty"`
29
	// Set of bookmarks in the book
30
	Bookmarks map[string]Bookmark `yaml:"bookmarks,omitempty"`
31
}
32

33
type BookSet []Book
34

35
func (setP *BookSet) Book(id string, defaultSpeed float64) Book {
36
	for _, b := range *setP {
37
		if b.ID == id {
38
			return b
39
		}
40
	}
41
	return Book{
42
		ID:        id,
43
		Speed:     defaultSpeed,
44
		Bookmarks: make(map[string]Bookmark),
45
	}
46
}
47

48
func (setP *BookSet) SetBook(book Book) {
49
	set := *setP
50
	defer func() { *setP = set }()
51

52
	for i, b := range set {
53
		if b.ID == book.ID {
54
			set[i] = book
55
			set[0], set[i] = set[i], set[0]
56
			return
57
		}
58
	}
59
	set = append(set, book)
60
	i := len(set) - 1
61
	set[0], set[i] = set[i], set[0]
62
}
63

64
func (setP *BookSet) LastBook() (Book, error) {
65
	if len(*setP) == 0 {
66
		return Book{}, BookNotFound
67
	}
68
	return (*setP)[0], nil
69
}
70

71
func (setP *BookSet) Tidy(ids []string) {
72
	books := make([]Book, 0, len(ids))
73
	for _, b := range *setP {
74
		if util.StringInSlice(b.ID, ids) {
75
			books = append(books, b)
76
		}
77
	}
78
	*setP = books
79
}
80

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.