Public
Edited
Feb 17, 2023
Insert cell
Insert cell
Type JavaScript, then Shift-Enter. Ctrl-space for more options. Arrow ↑/↓ to switch modes.

Insert cell
ast = (await FileAttachment("vega.json")).json()
Insert cell
jsConvert = import("https://cdn.skypack.dev/js-convert-case@4.2.0?min")
Insert cell
Insert cell
function parseValue({ kind, members, typeName, literal }) {
switch (kind) {
case "TypeLiteral":
return `Values { ${parseStruct(members)} }`;
case "TypeReference":
return `${typeName.escapedText}(${typeName.escapedText})`;
case "LiteralType":
case "StringLiteral":
return jsConvert.toPascalCase(literal.text);

case "NumberKeyword":
return "Value(f64)";
case "BooleanKeyword":
return "Value(bool)";
case "StringKeyword":
return "Value(String)";
}
return "todo!()";
}
Insert cell
function parseStructValue({ typeName, literal, kind, members, type }) {
switch (kind) {
case "TypeLiteral":
return parseStructValue({ members });
case "TypeReference":
return typeName.escapedText;
case "UnionType":
// return type.types.map((t) =>);
case "LiteralType":
return "todo!()";
case "StringLiteral":
return "String";

case "NumberKeyword":
return "f64";
case "BooleanKeyword":
return "bool";
case "StringKeyword":
return "String";
}
return "todo!()";
}
Insert cell
function parseStruct(members) {
return members
.flatMap(({ name, type, questionToken }) => {
const typeDesc = parseStructValue(type);
const typeText = questionToken ? `Option<${typeDesc}>` : typeDesc;
return `${jsConvert.toSnakeCase(name?.escapedText)}: ${typeDesc}`;
})
.join(", ");
}
Insert cell
new Set(ast.statements.map((d) => d.type?.kind).filter((d) => d))
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more