podman

Форк
0
122 строки · 3.2 Кб
1
package toml
2

3
import (
4
	"fmt"
5
	"strings"
6
	"time"
7

8
	"github.com/pelletier/go-toml/v2/unstable"
9
)
10

11
// LocalDate represents a calendar day in no specific timezone.
12
type LocalDate struct {
13
	Year  int
14
	Month int
15
	Day   int
16
}
17

18
// AsTime converts d into a specific time instance at midnight in zone.
19
func (d LocalDate) AsTime(zone *time.Location) time.Time {
20
	return time.Date(d.Year, time.Month(d.Month), d.Day, 0, 0, 0, 0, zone)
21
}
22

23
// String returns RFC 3339 representation of d.
24
func (d LocalDate) String() string {
25
	return fmt.Sprintf("%04d-%02d-%02d", d.Year, d.Month, d.Day)
26
}
27

28
// MarshalText returns RFC 3339 representation of d.
29
func (d LocalDate) MarshalText() ([]byte, error) {
30
	return []byte(d.String()), nil
31
}
32

33
// UnmarshalText parses b using RFC 3339 to fill d.
34
func (d *LocalDate) UnmarshalText(b []byte) error {
35
	res, err := parseLocalDate(b)
36
	if err != nil {
37
		return err
38
	}
39
	*d = res
40
	return nil
41
}
42

43
// LocalTime represents a time of day of no specific day in no specific
44
// timezone.
45
type LocalTime struct {
46
	Hour       int // Hour of the day: [0; 24[
47
	Minute     int // Minute of the hour: [0; 60[
48
	Second     int // Second of the minute: [0; 60[
49
	Nanosecond int // Nanoseconds within the second:  [0, 1000000000[
50
	Precision  int // Number of digits to display for Nanosecond.
51
}
52

53
// String returns RFC 3339 representation of d.
54
// If d.Nanosecond and d.Precision are zero, the time won't have a nanosecond
55
// component. If d.Nanosecond > 0 but d.Precision = 0, then the minimum number
56
// of digits for nanoseconds is provided.
57
func (d LocalTime) String() string {
58
	s := fmt.Sprintf("%02d:%02d:%02d", d.Hour, d.Minute, d.Second)
59

60
	if d.Precision > 0 {
61
		s += fmt.Sprintf(".%09d", d.Nanosecond)[:d.Precision+1]
62
	} else if d.Nanosecond > 0 {
63
		// Nanoseconds are specified, but precision is not provided. Use the
64
		// minimum.
65
		s += strings.Trim(fmt.Sprintf(".%09d", d.Nanosecond), "0")
66
	}
67

68
	return s
69
}
70

71
// MarshalText returns RFC 3339 representation of d.
72
func (d LocalTime) MarshalText() ([]byte, error) {
73
	return []byte(d.String()), nil
74
}
75

76
// UnmarshalText parses b using RFC 3339 to fill d.
77
func (d *LocalTime) UnmarshalText(b []byte) error {
78
	res, left, err := parseLocalTime(b)
79
	if err == nil && len(left) != 0 {
80
		err = unstable.NewParserError(left, "extra characters")
81
	}
82
	if err != nil {
83
		return err
84
	}
85
	*d = res
86
	return nil
87
}
88

89
// LocalDateTime represents a time of a specific day in no specific timezone.
90
type LocalDateTime struct {
91
	LocalDate
92
	LocalTime
93
}
94

95
// AsTime converts d into a specific time instance in zone.
96
func (d LocalDateTime) AsTime(zone *time.Location) time.Time {
97
	return time.Date(d.Year, time.Month(d.Month), d.Day, d.Hour, d.Minute, d.Second, d.Nanosecond, zone)
98
}
99

100
// String returns RFC 3339 representation of d.
101
func (d LocalDateTime) String() string {
102
	return d.LocalDate.String() + "T" + d.LocalTime.String()
103
}
104

105
// MarshalText returns RFC 3339 representation of d.
106
func (d LocalDateTime) MarshalText() ([]byte, error) {
107
	return []byte(d.String()), nil
108
}
109

110
// UnmarshalText parses b using RFC 3339 to fill d.
111
func (d *LocalDateTime) UnmarshalText(data []byte) error {
112
	res, left, err := parseLocalDateTime(data)
113
	if err == nil && len(left) != 0 {
114
		err = unstable.NewParserError(left, "extra characters")
115
	}
116
	if err != nil {
117
		return err
118
	}
119

120
	*d = res
121
	return nil
122
}
123

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

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

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

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