120 lines
3.2 KiB
TypeScript
120 lines
3.2 KiB
TypeScript
/* tslint:disable:ordered-imports object-literal-shorthand */
|
|
import {
|
|
createSimpleSchema, primitive, object, ModelSchema, PropSchema,
|
|
} from "serializr";
|
|
import list from "./list";
|
|
import * as s from "..";
|
|
|
|
export const duration: PropSchema = {
|
|
serializer: (d: s.Duration | null) =>
|
|
d != null ? d.toSeconds() : null,
|
|
deserializer: (json: any, done) => {
|
|
if (typeof json === "number") {
|
|
done(null, s.Duration.fromSeconds(json));
|
|
} else {
|
|
done(new Error(`Duration expects a number, not ${json}`), undefined);
|
|
}
|
|
},
|
|
};
|
|
|
|
export const date: PropSchema = {
|
|
serializer: (jsDate: Date | null) => jsDate != null ?
|
|
jsDate.toISOString() : null,
|
|
deserializer: (json: any, done) => {
|
|
if (json === null) {
|
|
return done(null, null);
|
|
}
|
|
try {
|
|
done(null, new Date(json));
|
|
} catch (e) {
|
|
done(e, undefined);
|
|
}
|
|
},
|
|
};
|
|
|
|
export const dateOfYear: ModelSchema<s.DateOfYear> = {
|
|
factory: () => new s.DateOfYear(),
|
|
props: {
|
|
year: primitive(),
|
|
month: primitive(), // this only works if it is represented as a # from 0-12
|
|
day: primitive(),
|
|
},
|
|
};
|
|
|
|
export const timeOfDay: ModelSchema<s.TimeOfDay> = {
|
|
factory: () => new s.TimeOfDay(),
|
|
props: {
|
|
hour: primitive(),
|
|
minute: primitive(),
|
|
second: primitive(),
|
|
millisecond: primitive(),
|
|
},
|
|
};
|
|
|
|
export const section: ModelSchema<s.Section> = {
|
|
factory: (c) => new (c.parentContext.target as s.SprinklersDevice).sectionConstructor(
|
|
c.parentContext.target, c.json.id),
|
|
props: {
|
|
name: primitive(),
|
|
state: primitive(),
|
|
},
|
|
};
|
|
|
|
export const sectionRun: ModelSchema<s.SectionRun> = {
|
|
factory: (c) => new s.SectionRun(c.json.id),
|
|
props: {
|
|
id: primitive(),
|
|
section: primitive(),
|
|
duration: duration,
|
|
startTime: date,
|
|
endTime: date,
|
|
},
|
|
};
|
|
|
|
export const sectionRunner: ModelSchema<s.SectionRunner> = {
|
|
factory: (c) => new (c.parentContext.target as s.SprinklersDevice).sectionRunnerConstructor(
|
|
c.parentContext.target),
|
|
props: {
|
|
queue: list(object(sectionRun)),
|
|
current: object(sectionRun),
|
|
paused: primitive(),
|
|
},
|
|
};
|
|
|
|
export const schedule: ModelSchema<s.Schedule> = {
|
|
factory: () => new s.Schedule(),
|
|
props: {
|
|
times: list(object(timeOfDay)),
|
|
weekdays: list(primitive()),
|
|
from: object(dateOfYear),
|
|
to: object(dateOfYear),
|
|
},
|
|
};
|
|
|
|
export const programItem: ModelSchema<s.ProgramItem> = {
|
|
factory: () => new s.ProgramItem(),
|
|
props: {
|
|
section: primitive(),
|
|
duration: duration,
|
|
},
|
|
};
|
|
|
|
export const program: ModelSchema<s.Program> = {
|
|
factory: (c) => new (c.parentContext.target as s.SprinklersDevice).programConstructor(
|
|
c.parentContext.target, c.json.id),
|
|
props: {
|
|
name: primitive(),
|
|
enabled: primitive(),
|
|
schedule: object(schedule),
|
|
sequence: list(object(programItem)),
|
|
running: primitive(),
|
|
},
|
|
};
|
|
|
|
export const sprinklersDevice = createSimpleSchema({
|
|
connected: primitive(),
|
|
sections: list(object(section)),
|
|
sectionRunner: object(sectionRunner),
|
|
programs: list(object(program)),
|
|
});
|