Fixes multiple plots

This commit is contained in:
Sam Nolan 2022-09-21 09:39:28 +09:30
parent 13f599be33
commit 483aaf73db

View File

@ -1,5 +1,11 @@
import * as yup from "yup"; import * as yup from "yup";
import { SqDistribution, result, SqRecord } from "@quri/squiggle-lang"; import {
SqValue,
SqValueTag,
SqDistribution,
result,
SqRecord,
} from "@quri/squiggle-lang";
export type LabeledDistribution = { export type LabeledDistribution = {
name: string; name: string;
@ -22,47 +28,53 @@ function ok<a, b>(x: a): result<a, b> {
const schema = yup const schema = yup
.object() .object()
.strict() .strict()
.noUnknown()
.shape({ .shape({
distributions: yup.object().shape({ distributions: yup
tag: yup.mixed().oneOf(["array"]), .array()
value: yup .required()
.array() .of(
.of( yup.object().required().shape({
yup.object().shape({ name: yup.string().required(),
tag: yup.mixed().oneOf(["record"]), distribution: yup.mixed(),
value: yup.object({ })
name: yup.object().shape({ ),
tag: yup.mixed().oneOf(["string"]),
value: yup.string().required(),
}),
// color: yup
// .object({
// tag: yup.mixed().oneOf(["string"]),
// value: yup.string().required(),
// })
// .default(undefined),
distribution: yup.object({
tag: yup.mixed().oneOf(["distribution"]),
value: yup.mixed(),
}),
}),
})
)
.required(),
}),
}); });
type JsonObject =
| string
| { [key: string]: JsonObject }
| JsonObject[]
| SqDistribution;
function toJson(val: SqValue): JsonObject {
if (val.tag === SqValueTag.String) {
return val.value;
} else if (val.tag === SqValueTag.Record) {
return toJsonRecord(val.value);
} else if (val.tag === SqValueTag.Array) {
return val.value.getValues().map(toJson);
} else if (val.tag === SqValueTag.Distribution) {
return val.value;
} else {
throw new Error("Could not parse object of type " + val.tag);
}
}
function toJsonRecord(val: SqRecord): JsonObject {
let recordObject: JsonObject = {};
val.entries().forEach(([key, value]) => (recordObject[key] = toJson(value)));
return recordObject;
}
export function parsePlot(record: SqRecord): result<Plot, string> { export function parsePlot(record: SqRecord): result<Plot, string> {
try { try {
const plotRecord = schema.validateSync(record); const plotRecord = schema.validateSync(toJsonRecord(record));
return ok({ if (plotRecord.distributions) {
distributions: plotRecord.distributions.value.map((x) => ({ return ok({ distributions: plotRecord.distributions.map((x) => x) });
name: x.value.name.value, } else {
// color: x.value.color?.value, // not supported yet // I have no idea why yup's typings thinks this is possible
distribution: x.value.distribution.value, return error("no distributions field. Should never get here");
})), }
});
} catch (e) { } catch (e) {
const message = e instanceof Error ? e.message : "Unknown error"; const message = e instanceof Error ? e.message : "Unknown error";
return error(message); return error(message);