/* * Базовые, наиболее общие определения */ namespace java com.rbkmoney.damsel.base /** Идентификатор */ typedef string ID /** Идентификатор некоторого события */ typedef i64 EventID /** Идентификатор некоторого события в рамках одной машины */ typedef i32 SequenceID /** Непрозрачный для участника общения набор данных */ typedef binary Opaque /** Набор данных, подлежащий интерпретации согласно типу содержимого. */ struct Content { /** Тип содержимого, согласно [RFC2046](https://www.ietf.org/rfc/rfc2046) */ 1: required string type 2: required binary data } /** * Отметка во времени согласно RFC 3339. * * Строка должна содержать дату и время в UTC в следующем формате: * `2016-03-22T06:12:27Z`. */ typedef string Timestamp /** * Временной интервал * не заданное значение границы считается бесконечностью */ struct TimestampInterval { 1: optional TimestampIntervalBound lower_bound 2: optional TimestampIntervalBound upper_bound } struct TimestampIntervalBound { 1: required BoundType bound_type 2: required Timestamp bound_time } enum BoundType { inclusive exclusive } /** * Промежуток во времени. * * Порядок применения отрезков к моменту времени: от более протяжённых (годы) к * менее протяжённым (секунды). * * Если какой-либо отрезок не задан, предполагается, что он равен 0. */ struct TimeSpan { 1: optional i16 years 2: optional i16 months 4: optional i16 days 5: optional i16 hours 6: optional i16 minutes 7: optional i16 seconds } /** День недели */ enum DayOfWeek { Mon = 1 Tue = 2 Wed = 3 Thu = 4 Fri = 5 Sat = 6 Sun = 7 } /** Год */ typedef i32 Year /** Месяц года */ enum Month { Jan = 1 Feb = 2 Mar = 3 Apr = 4 May = 5 Jun = 6 Jul = 7 Aug = 8 Sep = 9 Oct = 10 Nov = 11 Dec = 12 } /** День месяца */ typedef i8 DayOfMonth /** * Расписание. * * Модель по аналогии с записью в [crontab][1], за исключением максимального * разрешения, которое составляет 1 секунду. * * Как и в случае с [crontab][1], если задан как некоторый `day_of_month`, так и * некоторый `day_of_week`, то запланированные согласно этому расписанию события * должны произойти при наступлении _любого_ из них. * * Например, если событие запланировано следующим образом: * * - year = every * - month = every * - day of month = on { 15 25 } * - day of week = on { Fri } * - hour = on { 9 } * - minute = on { 0 } * - second = on { 0 } * * ...то в июне 2018 года оно должно выполнится в следующие моменты: * * - 2018 Jun 01 09:00:00 (потому что пятница), * - 2018 Jun 08 09:00:00 (потому что пятница), * - 2018 Jun 15 09:00:00 (потому что пятница и 15-е число), * - 2018 Jun 22 09:00:00 (потому что пятница), * - 2018 Jun 25 09:00:00 (потому что 25-е число), * - 2018 Jun 29 09:00:00 (потому что пятница). * * [1]: http://man7.org/linux/man-pages/man5/crontab.5.html */ struct Schedule { 1: required ScheduleYear year 2: required ScheduleMonth month 3: required ScheduleFragment day_of_month 4: required ScheduleDayOfWeek day_of_week 5: required ScheduleFragment hour 6: required ScheduleFragment minute 7: required ScheduleFragment second } struct ScheduleEvery { /** Шаг. * * Как отсутствие, так и указание любого значения ≤ 1 равнозначно поведению * _каждый первый фрагмент времени_. */ 1: optional i8 nth } union ScheduleFragment { 1: ScheduleEvery every 2: set on } union ScheduleDayOfWeek { 1: ScheduleEvery every 2: set on } union ScheduleMonth { 1: ScheduleEvery every 2: set on } union ScheduleYear { 1: ScheduleEvery every 2: set on } /** Часовой пояс, согласно IANA Timezone Database. */ typedef string Timezone /** Отображение из строки в строку */ typedef map StringMap /** Рациональное число. */ struct Rational { 1: required i64 p 2: required i64 q } /** Отрезок времени в секундах */ typedef i32 Timeout /** Значение ассоциации */ typedef string Tag /** Критерий остановки таймера */ union Timer { /** Отрезок времени, после истечения которого таймер остановится */ 1: Timeout timeout /** Отметка во времени, при пересечении которой таймер остановится */ 2: Timestamp deadline } /** * Исключение, сигнализирующее о непригодных с точки зрения бизнес-логики входных данных */ exception InvalidRequest { /** Список пригодных для восприятия человеком ошибок во входных данных */ 1: required list errors }