63 lines
1.5 KiB
TypeScript
63 lines
1.5 KiB
TypeScript
import * as xml from "xml";
|
|
import { Interval, Workout } from "./ast";
|
|
|
|
// Zwift Workout XML generator
|
|
|
|
const generateRangeInterval = (
|
|
tagName: "Warmup" | "Cooldown",
|
|
{ duration, intensity, cadence }: Interval
|
|
): xml.XmlObject => {
|
|
return {
|
|
[tagName]: [
|
|
{
|
|
_attr: {
|
|
Duration: duration,
|
|
PowerLow: intensity.from,
|
|
PowerHigh: intensity.from,
|
|
...(cadence ? { Cadence: cadence } : {}),
|
|
},
|
|
},
|
|
],
|
|
};
|
|
};
|
|
|
|
const generateSteadyStateInterval = ({ duration, intensity, cadence }: Interval): xml.XmlObject => {
|
|
return {
|
|
SteadyState: [
|
|
{
|
|
_attr: {
|
|
Duration: duration,
|
|
Power: intensity.from,
|
|
...(cadence ? { Cadence: cadence } : {}),
|
|
},
|
|
},
|
|
],
|
|
};
|
|
};
|
|
|
|
const generateInterval = (interval: Interval): xml.XmlObject => {
|
|
const { intensity } = interval;
|
|
if (intensity.from < intensity.to) {
|
|
return generateRangeInterval("Warmup", interval);
|
|
} else if (intensity.from > intensity.to) {
|
|
return generateRangeInterval("Cooldown", interval);
|
|
} else {
|
|
return generateSteadyStateInterval(interval);
|
|
}
|
|
};
|
|
|
|
export const generateZwo = ({ name, author, description, intervals }: Workout): string => {
|
|
return xml(
|
|
{
|
|
workout_file: [
|
|
{ name: name },
|
|
{ author: author },
|
|
{ description: description },
|
|
{ sportType: "bike" },
|
|
...intervals.map(generateInterval),
|
|
],
|
|
},
|
|
{ indent: " " }
|
|
);
|
|
};
|