diff options
Diffstat (limited to 'vendor/github.com/superseriousbusiness/activity/streams/values/duration/gen_duration.go')
-rw-r--r-- | vendor/github.com/superseriousbusiness/activity/streams/values/duration/gen_duration.go | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/vendor/github.com/superseriousbusiness/activity/streams/values/duration/gen_duration.go b/vendor/github.com/superseriousbusiness/activity/streams/values/duration/gen_duration.go new file mode 100644 index 000000000..8125a6822 --- /dev/null +++ b/vendor/github.com/superseriousbusiness/activity/streams/values/duration/gen_duration.go @@ -0,0 +1,146 @@ +// Code generated by astool. DO NOT EDIT. + +package duration + +import ( + "fmt" + "math" + "regexp" + "strconv" + "time" +) + +// SerializeDuration converts a duration value to an interface representation +// suitable for marshalling into a text or binary format. +func SerializeDuration(this time.Duration) (interface{}, error) { + // Seriously questioning my life choices. + s := "P" + if this < 0 { + s = "-P" + this = -1 * this + } + var tally time.Duration + // Assume 8760 Hours per 365 days, cannot account for leap years in xsd:duration. :( + if years := this.Hours() / 8760.0; years >= 1 { + nYears := int64(math.Floor(years)) + tally += time.Duration(nYears) * 8760 * time.Hour + s = fmt.Sprintf("%s%dY", s, nYears) + } + // Assume 30 days per month, cannot account for months lasting 31, 30, 29, or 28 days in xsd:duration. :( + if months := (this.Hours() - tally.Hours()) / 720.0; months >= 1 { + nMonths := int64(math.Floor(months)) + tally += time.Duration(nMonths) * 720 * time.Hour + s = fmt.Sprintf("%s%dM", s, nMonths) + } + if days := (this.Hours() - tally.Hours()) / 24.0; days >= 1 { + nDays := int64(math.Floor(days)) + tally += time.Duration(nDays) * 24 * time.Hour + s = fmt.Sprintf("%s%dD", s, nDays) + } + if tally < this { + s = fmt.Sprintf("%sT", s) + if hours := this.Hours() - tally.Hours(); hours >= 1 { + nHours := int64(math.Floor(hours)) + tally += time.Duration(nHours) * time.Hour + s = fmt.Sprintf("%s%dH", s, nHours) + } + if minutes := this.Minutes() - tally.Minutes(); minutes >= 1 { + nMinutes := int64(math.Floor(minutes)) + tally += time.Duration(nMinutes) * time.Minute + s = fmt.Sprintf("%s%dM", s, nMinutes) + } + if seconds := this.Seconds() - tally.Seconds(); seconds >= 1 { + nSeconds := int64(math.Floor(seconds)) + tally += time.Duration(nSeconds) * time.Second + s = fmt.Sprintf("%s%dS", s, nSeconds) + } + } + return s, nil +} + +// DeserializeDuration creates duration value from an interface representation +// that has been unmarshalled from a text or binary format. +func DeserializeDuration(this interface{}) (time.Duration, error) { + // Maybe this time it will be easier. + if s, ok := this.(string); ok { + isNeg := false + if s[0] == '-' { + isNeg = true + s = s[1:] + } + if s[0] != 'P' { + return 0, fmt.Errorf("%s malformed: missing 'P' for xsd:duration", s) + } + re := regexp.MustCompile(`P(\d*Y)?(\d*M)?(\d*D)?(T(\d*H)?(\d*M)?(\d*S)?)?`) + res := re.FindStringSubmatch(s) + var dur time.Duration + nYear := res[1] + if len(nYear) > 0 { + nYear = nYear[:len(nYear)-1] + vYear, err := strconv.ParseInt(nYear, 10, 64) + if err != nil { + return 0, err + } + // Assume 8760 Hours per 365 days, cannot account for leap years in xsd:duration. :( + dur += time.Duration(vYear) * time.Hour * 8760 + } + nMonth := res[2] + if len(nMonth) > 0 { + nMonth = nMonth[:len(nMonth)-1] + vMonth, err := strconv.ParseInt(nMonth, 10, 64) + if err != nil { + return 0, err + } + // Assume 30 days per month, cannot account for months lasting 31, 30, 29, or 28 days in xsd:duration. :( + dur += time.Duration(vMonth) * time.Hour * 720 + } + nDay := res[3] + if len(nDay) > 0 { + nDay = nDay[:len(nDay)-1] + vDay, err := strconv.ParseInt(nDay, 10, 64) + if err != nil { + return 0, err + } + dur += time.Duration(vDay) * time.Hour * 24 + } + nHour := res[5] + if len(nHour) > 0 { + nHour = nHour[:len(nHour)-1] + vHour, err := strconv.ParseInt(nHour, 10, 64) + if err != nil { + return 0, err + } + dur += time.Duration(vHour) * time.Hour + } + nMinute := res[6] + if len(nMinute) > 0 { + nMinute = nMinute[:len(nMinute)-1] + vMinute, err := strconv.ParseInt(nMinute, 10, 64) + if err != nil { + return 0, err + } + dur += time.Duration(vMinute) * time.Minute + } + nSecond := res[7] + if len(nSecond) > 0 { + nSecond = nSecond[:len(nSecond)-1] + vSecond, err := strconv.ParseInt(nSecond, 10, 64) + if err != nil { + return 0, err + } + dur += time.Duration(vSecond) * time.Second + } + if isNeg { + dur *= -1 + } + return dur, nil + } else { + return 0, fmt.Errorf("%v cannot be interpreted as a string for xsd:duration", this) + } +} + +// LessDuration returns true if the left duration value is less than the right +// value. +func LessDuration(lhs, rhs time.Duration) bool { + return lhs < rhs +} |