syntax = "proto3";

package java.time;

// IDs: 90 - 109

/**
 * @TypeId(90)
 */
enum DayOfWeek {
	MONDAY	= 0;
	TUESDAY	= 1;
	WEDNESDAY	= 2;
	THURSDAY	= 3;
	FRIDAY	= 4;
	SATURDAY	= 5;
	SUNDAY	= 6;
}

/**
 * @TypeId(91)
 */
message Duration {
	oneof seconds {
		uint64	positiveSeconds	= 1;
		uint64	negativeSeconds	= 2;
	}
	uint32	millisOfSecond	= 3;
	uint32	nanosOfSecond	= 4;
}

/**
 * @TypeId(92)
 */
message Instant {
	oneof seconds {
		uint64	postEpochSeconds	= 1;
		uint64	preEpochSeconds	= 2;
	}
	uint32	millisOfSecond	= 3;
	uint32	nanosOfSecond	= 4;
}

/**
 * @TypeId(93)
 */
message LocalDate {
	oneof epochDay {
		uint64	postEpochDay	= 1;
		uint64	preEpochDay	= 2;
	}
}

/**
 * @TypeId(94)
 */
message LocalDateTime {
	oneof epochDay {
		uint64	postEpochDay	= 1;
		uint64	preEpochDay	= 2;
	}
	uint32	hoursOfDay	= 3;
	uint32	minutesOfDay	= 4;
	uint32	secondsOfDay	= 5;
	uint32	millisOfSecond	= 6;
	uint32	nanosOfSecond	= 7;
}

/**
 * @TypeId(95)
 */
message LocalTime {
	uint32	hoursOfDay	= 1;
	uint32	minutesOfDay	= 2;
	uint32	secondsOfDay	= 3;
	uint32	millisOfSecond	= 4;
	uint32	nanosOfSecond	= 5;
}

/**
 * @TypeId(96)
 */
enum Month {
	JANUARY	= 0;
	FEBRUARY	= 1;
	MARCH	= 2;
	APRIL	= 3;
	MAY	= 4;
	JUNE	= 5;
	JULY	= 6;
	AUGUST	= 7;
	SEPTEMBER	= 8;
	OCTOBER	= 9;
	NOVEMBER	= 10;
	DECEMBER	= 11;
}

/**
 * @TypeId(97)
 */
message MonthDay {
	Month	month	= 1;
	uint32	day	= 2;
}

/**
 * @TypeId(98)
 */
message OffsetDateTime {
	oneof epochDay {
		uint64	postEpochDay	= 1;
		uint64	preEpochDay	= 2;
	}
	uint32	hoursOfDay	= 3;
	uint32	minutesOfDay	= 4;
	uint32	secondsOfDay	= 5;
	uint32	millisOfSecond	= 6;
	uint32	nanosOfSecond	= 7;
	sint32	offsetHours	= 8;
	sint32	offsetMinutes	= 9;
	sint32	offsetSeconds	= 10;
}

/**
 * @TypeId(99)
 */
message OffsetTime {
	uint32	hoursOfDay	= 1;
	uint32	minutesOfDay	= 2;
	uint32	secondsOfDay	= 3;
	uint32	millisOfSecond	= 4;
	uint32	nanosOfSecond	= 5;
	sint32	offsetHours	= 6;
	sint32	offsetMinutes	= 7;
	sint32	offsetSeconds	= 8;
}

/**
 * @TypeId(100)
 */
message Period {
	sint32	years	= 1;
	sint32	months	= 2;
	sint32	days	= 3;
}

/**
 * @TypeId(101)
 */
message Year {
	oneof epochYear {
		sint32	postEpochYear	= 1;
		sint32	preEpochYear	= 2;
	}
}

/**
 * @TypeId(102)
 */
message YearMonth {
	oneof epochYear {
		sint32	postEpochYear	= 1;
		sint32	preEpochYear	= 2;
	}
	Month	month	= 3;
}

/**
 * @TypeId(103)
 */
message ZoneId {
	string	id	= 1;
}

/**
 * @TypeId(104)
 */
message ZoneOffset {
	sint32	hours	= 1;
	sint32	minutes	= 2;
	sint32	seconds	= 3;
}

/**
 * @TypeId(105)
 */
message ZonedDateTime {
	oneof epochDay {
		uint64	postEpochDay	= 1;
		uint64	preEpochDay	= 2;
	}
	uint32	hoursOfDay	= 3;
	uint32	minutesOfDay	= 4;
	uint32	secondsOfDay	= 5;
	uint32	millisOfSecond	= 6;
	uint32	nanosOfSecond	= 7;
	sint32	offsetHours	= 8;
	sint32	offsetMinutes	= 9;
	sint32	offsetSeconds	= 10;
	string	zoneId	= 11;
}
