zwiftout/src/generateZwo.ts

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: " " }
);
};