a-h / generate

Generates Go (golang) Structs from JSON schema.
MIT License
444 stars 137 forks source link

Invalid generated Go code when parsing vega-lite json schema #44

Open morangorin opened 6 years ago

morangorin commented 6 years ago

Generating go code from: https://vega.github.io/schema/vega-lite/v2.0.json generates go with an invalid syntax. There are at least the following issues:

  1. some descriptions include the character \n and html. Multi-line comments are being generated but are not protected with //
  2. some names in that JSON schema include special characters such as < and > which are invalid in structure name in Go
  3. some references are not found. Perhaps they could be replaced by interface{} such that the code always compiles
a-h commented 6 years ago

Thanks, I can spot that some of the references not being found is basically the same issue as #43. The current generation tool doesn't support the anyOf behaviour.

So this is supported:

{
        "$schema": "http://json-schema.org/schema#",
        "title": "root",
        "properties": {
            "name": {
                "type": [ "integer", "string" ]
            }
        }
    }

But not this:

{
        "$schema": "http://json-schema.org/draft-04/schema#",
        "id": "Example",
        "properties": {
            "name" : {
                "anyOf": [ "string", "number" ] 
            }
        }
    }
a-h commented 6 years ago

So, to support number 3, would probably need to rework the Schema type to change the type of the Properties field away from map[string]*Schema and to something more similar to the AdditionalProperties type which has custom unmarshalling to support the existence of anyOf, allOf keys.

a-h commented 6 years ago

The clean up of the descriptions and JSON schema names should be trivial to resolve though.

a-h commented 6 years ago

I'm guessing you want to use the schema generation tool to make a Go API for Vega, which would be quite cool. Those two improvements reduce the work of fixing up the output a fair amount, I think having loads of interface{} on the API surface isn't what you want, but if you want to try it, you can just update generator.go from:

    return "undefined", fmt.Errorf("failed to get a primitive type for schemaType %s and subtype %s",
        schemaType, subType)

To:

    return "interface{}", fmt.Errorf("failed to get a primitive type for schemaType %s and subtype %s",
        schemaType, subType)

I gave it a go and cleaned up the output:

// Code generated by schema-generate. DO NOT EDIT.
package vega

// AggregateTransform
type AggregateTransform struct {
    Aggregate []*AggregatedFieldDef `json:"aggregate"`
    Groupby   []string              `json:"groupby,omitempty"`
}

// AggregatedFieldDef
type AggregatedFieldDef struct {
    As    string      `json:"as"`
    Field string      `json:"field"`
    Op    interface{} `json:"op"`
}

// AndFilter
type AndFilter struct {
    And interface{} `json:"and"`
}

// AutoSizeParams
type AutoSizeParams struct {
    Contains string      `json:"contains,omitempty"`
    Resize   bool        `json:"resize,omitempty"`
    Type     interface{} `json:"type,omitempty"`
}

// Axis
type Axis struct {
    Domain         bool        `json:"domain,omitempty"`
    Format         string      `json:"format,omitempty"`
    Grid           bool        `json:"grid,omitempty"`
    LabelAngle     float64     `json:"labelAngle,omitempty"`
    LabelBound     interface{} `json:"labelBound,omitempty"`
    LabelFlush     interface{} `json:"labelFlush,omitempty"`
    LabelOverlap   interface{} `json:"labelOverlap,omitempty"`
    LabelPadding   float64     `json:"labelPadding,omitempty"`
    Labels         bool        `json:"labels,omitempty"`
    MaxExtent      float64     `json:"maxExtent,omitempty"`
    MinExtent      float64     `json:"minExtent,omitempty"`
    Offset         float64     `json:"offset,omitempty"`
    Orient         interface{} `json:"orient,omitempty"`
    Position       float64     `json:"position,omitempty"`
    TickCount      float64     `json:"tickCount,omitempty"`
    TickSize       float64     `json:"tickSize,omitempty"`
    Ticks          bool        `json:"ticks,omitempty"`
    Title          interface{} `json:"title,omitempty"`
    TitleMaxLength float64     `json:"titleMaxLength,omitempty"`
    TitlePadding   float64     `json:"titlePadding,omitempty"`
    Values         interface{} `json:"values,omitempty"`
    Zindex         float64     `json:"zindex,omitempty"`
}

// AxisConfig
type AxisConfig struct {
    BandPosition    float64     `json:"bandPosition,omitempty"`
    Domain          bool        `json:"domain,omitempty"`
    DomainColor     string      `json:"domainColor,omitempty"`
    DomainWidth     float64     `json:"domainWidth,omitempty"`
    Grid            bool        `json:"grid,omitempty"`
    GridColor       string      `json:"gridColor,omitempty"`
    GridDash        []float64   `json:"gridDash,omitempty"`
    GridOpacity     float64     `json:"gridOpacity,omitempty"`
    GridWidth       float64     `json:"gridWidth,omitempty"`
    LabelAngle      float64     `json:"labelAngle,omitempty"`
    LabelBound      interface{} `json:"labelBound,omitempty"`
    LabelColor      string      `json:"labelColor,omitempty"`
    LabelFlush      interface{} `json:"labelFlush,omitempty"`
    LabelFont       string      `json:"labelFont,omitempty"`
    LabelFontSize   float64     `json:"labelFontSize,omitempty"`
    LabelLimit      float64     `json:"labelLimit,omitempty"`
    LabelOverlap    interface{} `json:"labelOverlap,omitempty"`
    LabelPadding    float64     `json:"labelPadding,omitempty"`
    Labels          bool        `json:"labels,omitempty"`
    MaxExtent       float64     `json:"maxExtent,omitempty"`
    MinExtent       float64     `json:"minExtent,omitempty"`
    ShortTimeLabels bool        `json:"shortTimeLabels,omitempty"`
    TickColor       string      `json:"tickColor,omitempty"`
    TickRound       bool        `json:"tickRound,omitempty"`
    TickSize        float64     `json:"tickSize,omitempty"`
    TickWidth       float64     `json:"tickWidth,omitempty"`
    Ticks           bool        `json:"ticks,omitempty"`
    TitleAlign      string      `json:"titleAlign,omitempty"`
    TitleAngle      float64     `json:"titleAngle,omitempty"`
    TitleBaseline   string      `json:"titleBaseline,omitempty"`
    TitleColor      string      `json:"titleColor,omitempty"`
    TitleFont       string      `json:"titleFont,omitempty"`
    TitleFontSize   float64     `json:"titleFontSize,omitempty"`
    TitleFontWeight interface{} `json:"titleFontWeight,omitempty"`
    TitleLimit      float64     `json:"titleLimit,omitempty"`
    TitleMaxLength  float64     `json:"titleMaxLength,omitempty"`
    TitlePadding    float64     `json:"titlePadding,omitempty"`
    TitleX          float64     `json:"titleX,omitempty"`
    TitleY          float64     `json:"titleY,omitempty"`
}

// AxisResolveMap
type AxisResolveMap struct {
    X interface{} `json:"x,omitempty"`
    Y interface{} `json:"y,omitempty"`
}

// BarConfig
type BarConfig struct {
    Align              interface{} `json:"align,omitempty"`
    Angle              float64     `json:"angle,omitempty"`
    Baseline           interface{} `json:"baseline,omitempty"`
    BinSpacing         float64     `json:"binSpacing,omitempty"`
    Color              string      `json:"color,omitempty"`
    ContinuousBandSize float64     `json:"continuousBandSize,omitempty"`
    DiscreteBandSize   float64     `json:"discreteBandSize,omitempty"`
    Dx                 float64     `json:"dx,omitempty"`
    Dy                 float64     `json:"dy,omitempty"`
    Fill               string      `json:"fill,omitempty"`
    FillOpacity        float64     `json:"fillOpacity,omitempty"`
    Filled             bool        `json:"filled,omitempty"`
    Font               string      `json:"font,omitempty"`
    FontSize           float64     `json:"fontSize,omitempty"`
    FontStyle          interface{} `json:"fontStyle,omitempty"`
    FontWeight         interface{} `json:"fontWeight,omitempty"`
    Interpolate        interface{} `json:"interpolate,omitempty"`
    Limit              float64     `json:"limit,omitempty"`
    Opacity            float64     `json:"opacity,omitempty"`
    Orient             interface{} `json:"orient,omitempty"`
    Radius             float64     `json:"radius,omitempty"`
    Shape              string      `json:"shape,omitempty"`
    Size               float64     `json:"size,omitempty"`
    Stroke             string      `json:"stroke,omitempty"`
    StrokeDash         []float64   `json:"strokeDash,omitempty"`
    StrokeDashOffset   float64     `json:"strokeDashOffset,omitempty"`
    StrokeOpacity      float64     `json:"strokeOpacity,omitempty"`
    StrokeWidth        float64     `json:"strokeWidth,omitempty"`
    Tension            float64     `json:"tension,omitempty"`
    Text               string      `json:"text,omitempty"`
    Theta              float64     `json:"theta,omitempty"`
}

// BinParams Binning properties or boolean flag for determining whether to bin data or not.
type BinParams struct {
    Base    float64   `json:"base,omitempty"`
    Divide  []float64 `json:"divide,omitempty"`
    Extent  []float64 `json:"extent,omitempty"`
    Maxbins float64   `json:"maxbins,omitempty"`
    Minstep float64   `json:"minstep,omitempty"`
    Nice    bool      `json:"nice,omitempty"`
    Step    float64   `json:"step,omitempty"`
    Steps   []float64 `json:"steps,omitempty"`
}

// BinTransform
type BinTransform struct {
    As    string      `json:"as"`
    Bin   interface{} `json:"bin"`
    Field string      `json:"field"`
}

// BrushConfig
type BrushConfig struct {
    Fill             string    `json:"fill,omitempty"`
    FillOpacity      float64   `json:"fillOpacity,omitempty"`
    Stroke           string    `json:"stroke,omitempty"`
    StrokeDash       []float64 `json:"strokeDash,omitempty"`
    StrokeDashOffset float64   `json:"strokeDashOffset,omitempty"`
    StrokeOpacity    float64   `json:"strokeOpacity,omitempty"`
    StrokeWidth      float64   `json:"strokeWidth,omitempty"`
}

// CalculateTransform
type CalculateTransform struct {
    As        string `json:"as"`
    Calculate string `json:"calculate"`
}

// CompositeUnitSpecAlias
type CompositeUnitSpecAlias struct {
    Data        interface{}            `json:"data,omitempty"`
    Description string                 `json:"description,omitempty"`
    Encoding    *Encoding              `json:"encoding"`
    Height      float64                `json:"height,omitempty"`
    Mark        interface{}            `json:"mark"`
    Name        string                 `json:"name,omitempty"`
    Selection   map[string]interface{} `json:"selection,omitempty"`
    Title       interface{}            `json:"title,omitempty"`
    Transform   []interface{}          `json:"transform,omitempty"`
    Width       float64                `json:"width,omitempty"`
}

// ConditionalMarkPropFieldDef
type ConditionalMarkPropFieldDef struct {
    Aggregate interface{} `json:"aggregate,omitempty"`
    Bin       interface{} `json:"bin,omitempty"`
    Field     interface{} `json:"field,omitempty"`
    Legend    interface{} `json:"legend,omitempty"`
    Scale     *Scale      `json:"scale,omitempty"`
    Selection interface{} `json:"selection"`
    Sort      interface{} `json:"sort,omitempty"`
    TimeUnit  interface{} `json:"timeUnit,omitempty"`
    Type      interface{} `json:"type"`
}

// ConditionalTextFieldDef
type ConditionalTextFieldDef struct {
    Aggregate interface{} `json:"aggregate,omitempty"`
    Bin       interface{} `json:"bin,omitempty"`
    Field     interface{} `json:"field,omitempty"`
    Format    string      `json:"format,omitempty"`
    Selection interface{} `json:"selection"`
    TimeUnit  interface{} `json:"timeUnit,omitempty"`
    Type      interface{} `json:"type"`
}

// ConditionalValueDef
type ConditionalValueDef struct {
    Selection interface{} `json:"selection"`
    Value     interface{} `json:"value"`
}

// Config
type Config struct {
    Area          *MarkConfig      `json:"area,omitempty"`
    Autosize      interface{}      `json:"autosize,omitempty"`
    Axis          *AxisConfig      `json:"axis,omitempty"`
    AxisBand      *VgAxisConfig    `json:"axisBand,omitempty"`
    AxisBottom    *VgAxisConfig    `json:"axisBottom,omitempty"`
    AxisLeft      *VgAxisConfig    `json:"axisLeft,omitempty"`
    AxisRight     *VgAxisConfig    `json:"axisRight,omitempty"`
    AxisTop       *VgAxisConfig    `json:"axisTop,omitempty"`
    AxisX         *VgAxisConfig    `json:"axisX,omitempty"`
    AxisY         *VgAxisConfig    `json:"axisY,omitempty"`
    Background    string           `json:"background,omitempty"`
    Bar           *BarConfig       `json:"bar,omitempty"`
    Circle        *MarkConfig      `json:"circle,omitempty"`
    CountTitle    string           `json:"countTitle,omitempty"`
    FieldTitle    string           `json:"fieldTitle,omitempty"`
    InvalidValues interface{}      `json:"invalidValues,omitempty"`
    Legend        *LegendConfig    `json:"legend,omitempty"`
    Line          *MarkConfig      `json:"line,omitempty"`
    Mark          *MarkConfig      `json:"mark,omitempty"`
    NumberFormat  string           `json:"numberFormat,omitempty"`
    Padding       interface{}      `json:"padding,omitempty"`
    Point         *MarkConfig      `json:"point,omitempty"`
    Range         *RangeConfig     `json:"range,omitempty"`
    Rect          *MarkConfig      `json:"rect,omitempty"`
    Rule          *MarkConfig      `json:"rule,omitempty"`
    Scale         *ScaleConfig     `json:"scale,omitempty"`
    Selection     *SelectionConfig `json:"selection,omitempty"`
    Square        *MarkConfig      `json:"square,omitempty"`
    Stack         interface{}      `json:"stack,omitempty"`
    Style         interface{}      `json:"style,omitempty"`
    Text          *TextConfig      `json:"text,omitempty"`
    Tick          *TickConfig      `json:"tick,omitempty"`
    TimeFormat    string           `json:"timeFormat,omitempty"`
    Title         *VgTitleConfig   `json:"title,omitempty"`
    View          *ViewConfig      `json:"view,omitempty"`
}

// CsvDataFormat
type CsvDataFormat struct {
    Parse interface{} `json:"parse,omitempty"`
    Type  string      `json:"type,omitempty"`
}

// DateTime Object for defining datetime in Vega-Lite Filter.
// If both month and quarter are provided, month has higher precedence.
// `day` cannot be combined with other date.
// We accept string for month and day names.
type DateTime struct {
    Date         float64     `json:"date,omitempty"`
    Day          interface{} `json:"day,omitempty"`
    Hours        float64     `json:"hours,omitempty"`
    Milliseconds float64     `json:"milliseconds,omitempty"`
    Minutes      float64     `json:"minutes,omitempty"`
    Month        interface{} `json:"month,omitempty"`
    Quarter      float64     `json:"quarter,omitempty"`
    Seconds      float64     `json:"seconds,omitempty"`
    Utc          bool        `json:"utc,omitempty"`
    Year         float64     `json:"year,omitempty"`
}

// Encoding
type Encoding struct {
    Color   interface{} `json:"color,omitempty"`
    Detail  interface{} `json:"detail,omitempty"`
    Opacity interface{} `json:"opacity,omitempty"`
    Order   interface{} `json:"order,omitempty"`
    Shape   interface{} `json:"shape,omitempty"`
    Size    interface{} `json:"size,omitempty"`
    Text    interface{} `json:"text,omitempty"`
    Tooltip interface{} `json:"tooltip,omitempty"`
    X       interface{} `json:"x,omitempty"`
    X2      interface{} `json:"x2,omitempty"`
    Y       interface{} `json:"y,omitempty"`
    Y2      interface{} `json:"y2,omitempty"`
}

// EncodingWithFacet
type EncodingWithFacet struct {
    Color   interface{}    `json:"color,omitempty"`
    Column  *FacetFieldDef `json:"column,omitempty"`
    Detail  interface{}    `json:"detail,omitempty"`
    Opacity interface{}    `json:"opacity,omitempty"`
    Order   interface{}    `json:"order,omitempty"`
    Row     *FacetFieldDef `json:"row,omitempty"`
    Shape   interface{}    `json:"shape,omitempty"`
    Size    interface{}    `json:"size,omitempty"`
    Text    interface{}    `json:"text,omitempty"`
    Tooltip interface{}    `json:"tooltip,omitempty"`
    X       interface{}    `json:"x,omitempty"`
    X2      interface{}    `json:"x2,omitempty"`
    Y       interface{}    `json:"y,omitempty"`
    Y2      interface{}    `json:"y2,omitempty"`
}

// EqualFilter
type EqualFilter struct {
    Equal    interface{} `json:"equal"`
    Field    string      `json:"field"`
    TimeUnit interface{} `json:"timeUnit,omitempty"`
}

// FacetFieldDef
type FacetFieldDef struct {
    Aggregate interface{} `json:"aggregate,omitempty"`
    Bin       interface{} `json:"bin,omitempty"`
    Field     interface{} `json:"field,omitempty"`
    Header    *Header     `json:"header,omitempty"`
    Sort      interface{} `json:"sort,omitempty"`
    TimeUnit  interface{} `json:"timeUnit,omitempty"`
    Type      interface{} `json:"type"`
}

// FacetMapping
type FacetMapping struct {
    Column *FacetFieldDef `json:"column,omitempty"`
    Row    *FacetFieldDef `json:"row,omitempty"`
}

// FacetSpec
type FacetSpec struct {
    Data        interface{}   `json:"data,omitempty"`
    Description string        `json:"description,omitempty"`
    Facet       *FacetMapping `json:"facet"`
    Name        string        `json:"name,omitempty"`
    Resolve     *Resolve      `json:"resolve,omitempty"`
    Spec        interface{}   `json:"spec"`
    Title       interface{}   `json:"title,omitempty"`
    Transform   []interface{} `json:"transform,omitempty"`
}

// FacetedCompositeUnitSpecAlias
type FacetedCompositeUnitSpecAlias struct {
    Data        interface{}            `json:"data,omitempty"`
    Description string                 `json:"description,omitempty"`
    Encoding    *EncodingWithFacet     `json:"encoding"`
    Height      float64                `json:"height,omitempty"`
    Mark        interface{}            `json:"mark"`
    Name        string                 `json:"name,omitempty"`
    Selection   map[string]interface{} `json:"selection,omitempty"`
    Title       interface{}            `json:"title,omitempty"`
    Transform   []interface{}          `json:"transform,omitempty"`
    Width       float64                `json:"width,omitempty"`
}

// FieldDef Definition object for a data field, its type and transformation of an encoding channel.
type FieldDef struct {
    Aggregate interface{} `json:"aggregate,omitempty"`
    Bin       interface{} `json:"bin,omitempty"`
    Field     interface{} `json:"field,omitempty"`
    TimeUnit  interface{} `json:"timeUnit,omitempty"`
    Type      interface{} `json:"type"`
}

// FilterTransform
type FilterTransform struct {
    Filter interface{} `json:"filter"`
}

// HConcatSpec
type HConcatSpec struct {
    Data        interface{}   `json:"data,omitempty"`
    Description string        `json:"description,omitempty"`
    Hconcat     []interface{} `json:"hconcat"`
    Name        string        `json:"name,omitempty"`
    Resolve     *Resolve      `json:"resolve,omitempty"`
    Title       interface{}   `json:"title,omitempty"`
    Transform   []interface{} `json:"transform,omitempty"`
}

// Header Headers of row / column channels for faceted plots.
type Header struct {
    Format     string      `json:"format,omitempty"`
    LabelAngle float64     `json:"labelAngle,omitempty"`
    Title      interface{} `json:"title,omitempty"`
}

// InlineData
type InlineData struct {
    Format interface{} `json:"format,omitempty"`
    Values interface{} `json:"values"`
}

// InterpolateParams
type InterpolateParams struct {
    Gamma float64 `json:"gamma,omitempty"`
    Type  string  `json:"type"`
}

// IntervalSelection
type IntervalSelection struct {
    Bind      string        `json:"bind,omitempty"`
    Empty     string        `json:"empty,omitempty"`
    Encodings []interface{} `json:"encodings,omitempty"`
    Fields    []string      `json:"fields,omitempty"`
    Mark      *BrushConfig  `json:"mark,omitempty"`
    On        interface{}   `json:"on,omitempty"`
    Resolve   interface{}   `json:"resolve,omitempty"`
    Translate interface{}   `json:"translate,omitempty"`
    Type      string        `json:"type"`
    Zoom      interface{}   `json:"zoom,omitempty"`
}

// IntervalSelectionConfig
type IntervalSelectionConfig struct {
    Bind      string        `json:"bind,omitempty"`
    Empty     string        `json:"empty,omitempty"`
    Encodings []interface{} `json:"encodings,omitempty"`
    Fields    []string      `json:"fields,omitempty"`
    Mark      *BrushConfig  `json:"mark,omitempty"`
    On        interface{}   `json:"on,omitempty"`
    Resolve   interface{}   `json:"resolve,omitempty"`
    Translate interface{}   `json:"translate,omitempty"`
    Zoom      interface{}   `json:"zoom,omitempty"`
}

// JsonDataFormat
type JsonDataFormat struct {
    Parse    interface{} `json:"parse,omitempty"`
    Property string      `json:"property,omitempty"`
    Type     string      `json:"type,omitempty"`
}

// LayerSpec
type LayerSpec struct {
    Data        interface{}   `json:"data,omitempty"`
    Description string        `json:"description,omitempty"`
    Height      float64       `json:"height,omitempty"`
    Layer       []interface{} `json:"layer"`
    Name        string        `json:"name,omitempty"`
    Resolve     *Resolve      `json:"resolve,omitempty"`
    Title       interface{}   `json:"title,omitempty"`
    Transform   []interface{} `json:"transform,omitempty"`
    Width       float64       `json:"width,omitempty"`
}

// Legend Properties of a legend or boolean flag for determining whether to show it.
type Legend struct {
    EntryPadding float64     `json:"entryPadding,omitempty"`
    Format       string      `json:"format,omitempty"`
    Offset       float64     `json:"offset,omitempty"`
    Orient       interface{} `json:"orient,omitempty"`
    Padding      float64     `json:"padding,omitempty"`
    TickCount    float64     `json:"tickCount,omitempty"`
    Title        interface{} `json:"title,omitempty"`
    Type         string      `json:"type,omitempty"`
    Values       interface{} `json:"values,omitempty"`
    Zindex       float64     `json:"zindex,omitempty"`
}

// LegendConfig
type LegendConfig struct {
    CornerRadius          float64     `json:"cornerRadius,omitempty"`
    EntryPadding          float64     `json:"entryPadding,omitempty"`
    FillColor             string      `json:"fillColor,omitempty"`
    GradientHeight        float64     `json:"gradientHeight,omitempty"`
    GradientLabelBaseline string      `json:"gradientLabelBaseline,omitempty"`
    GradientLabelLimit    float64     `json:"gradientLabelLimit,omitempty"`
    GradientLabelOffset   float64     `json:"gradientLabelOffset,omitempty"`
    GradientStrokeColor   string      `json:"gradientStrokeColor,omitempty"`
    GradientStrokeWidth   float64     `json:"gradientStrokeWidth,omitempty"`
    GradientWidth         float64     `json:"gradientWidth,omitempty"`
    LabelAlign            string      `json:"labelAlign,omitempty"`
    LabelBaseline         string      `json:"labelBaseline,omitempty"`
    LabelColor            string      `json:"labelColor,omitempty"`
    LabelFont             string      `json:"labelFont,omitempty"`
    LabelFontSize         float64     `json:"labelFontSize,omitempty"`
    LabelLimit            float64     `json:"labelLimit,omitempty"`
    LabelOffset           float64     `json:"labelOffset,omitempty"`
    Offset                float64     `json:"offset,omitempty"`
    Orient                interface{} `json:"orient,omitempty"`
    Padding               float64     `json:"padding,omitempty"`
    ShortTimeLabels       bool        `json:"shortTimeLabels,omitempty"`
    StrokeColor           string      `json:"strokeColor,omitempty"`
    StrokeDash            []float64   `json:"strokeDash,omitempty"`
    StrokeWidth           float64     `json:"strokeWidth,omitempty"`
    SymbolColor           string      `json:"symbolColor,omitempty"`
    SymbolSize            float64     `json:"symbolSize,omitempty"`
    SymbolStrokeWidth     float64     `json:"symbolStrokeWidth,omitempty"`
    SymbolType            string      `json:"symbolType,omitempty"`
    TitleAlign            string      `json:"titleAlign,omitempty"`
    TitleBaseline         string      `json:"titleBaseline,omitempty"`
    TitleColor            string      `json:"titleColor,omitempty"`
    TitleFont             string      `json:"titleFont,omitempty"`
    TitleFontSize         float64     `json:"titleFontSize,omitempty"`
    TitleFontWeight       interface{} `json:"titleFontWeight,omitempty"`
    TitleLimit            float64     `json:"titleLimit,omitempty"`
    TitlePadding          float64     `json:"titlePadding,omitempty"`
}

// LegendResolveMap
type LegendResolveMap struct {
    Color   interface{} `json:"color,omitempty"`
    Opacity interface{} `json:"opacity,omitempty"`
    Shape   interface{} `json:"shape,omitempty"`
    Size    interface{} `json:"size,omitempty"`
}

// LookupData
type LookupData struct {
    Data   interface{} `json:"data"`
    Fields []string    `json:"fields,omitempty"`
    Key    string      `json:"key"`
}

// LookupTransform
type LookupTransform struct {
    As      interface{} `json:"as,omitempty"`
    Default string      `json:"default,omitempty"`
    From    *LookupData `json:"from"`
    Lookup  string      `json:"lookup"`
}

// MarkConfig
type MarkConfig struct {
    Align            interface{} `json:"align,omitempty"`
    Angle            float64     `json:"angle,omitempty"`
    Baseline         interface{} `json:"baseline,omitempty"`
    Color            string      `json:"color,omitempty"`
    Dx               float64     `json:"dx,omitempty"`
    Dy               float64     `json:"dy,omitempty"`
    Fill             string      `json:"fill,omitempty"`
    FillOpacity      float64     `json:"fillOpacity,omitempty"`
    Filled           bool        `json:"filled,omitempty"`
    Font             string      `json:"font,omitempty"`
    FontSize         float64     `json:"fontSize,omitempty"`
    FontStyle        interface{} `json:"fontStyle,omitempty"`
    FontWeight       interface{} `json:"fontWeight,omitempty"`
    Interpolate      interface{} `json:"interpolate,omitempty"`
    Limit            float64     `json:"limit,omitempty"`
    Opacity          float64     `json:"opacity,omitempty"`
    Orient           interface{} `json:"orient,omitempty"`
    Radius           float64     `json:"radius,omitempty"`
    Shape            string      `json:"shape,omitempty"`
    Size             float64     `json:"size,omitempty"`
    Stroke           string      `json:"stroke,omitempty"`
    StrokeDash       []float64   `json:"strokeDash,omitempty"`
    StrokeDashOffset float64     `json:"strokeDashOffset,omitempty"`
    StrokeOpacity    float64     `json:"strokeOpacity,omitempty"`
    StrokeWidth      float64     `json:"strokeWidth,omitempty"`
    Tension          float64     `json:"tension,omitempty"`
    Text             string      `json:"text,omitempty"`
    Theta            float64     `json:"theta,omitempty"`
}

// MarkDef
type MarkDef struct {
    Align            interface{} `json:"align,omitempty"`
    Angle            float64     `json:"angle,omitempty"`
    Baseline         interface{} `json:"baseline,omitempty"`
    Clip             bool        `json:"clip,omitempty"`
    Color            string      `json:"color,omitempty"`
    Dx               float64     `json:"dx,omitempty"`
    Dy               float64     `json:"dy,omitempty"`
    Fill             string      `json:"fill,omitempty"`
    FillOpacity      float64     `json:"fillOpacity,omitempty"`
    Filled           bool        `json:"filled,omitempty"`
    Font             string      `json:"font,omitempty"`
    FontSize         float64     `json:"fontSize,omitempty"`
    FontStyle        interface{} `json:"fontStyle,omitempty"`
    FontWeight       interface{} `json:"fontWeight,omitempty"`
    Interpolate      interface{} `json:"interpolate,omitempty"`
    Limit            float64     `json:"limit,omitempty"`
    Opacity          float64     `json:"opacity,omitempty"`
    Orient           interface{} `json:"orient,omitempty"`
    Radius           float64     `json:"radius,omitempty"`
    Shape            string      `json:"shape,omitempty"`
    Size             float64     `json:"size,omitempty"`
    Stroke           string      `json:"stroke,omitempty"`
    StrokeDash       []float64   `json:"strokeDash,omitempty"`
    StrokeDashOffset float64     `json:"strokeDashOffset,omitempty"`
    StrokeOpacity    float64     `json:"strokeOpacity,omitempty"`
    StrokeWidth      float64     `json:"strokeWidth,omitempty"`
    Style            interface{} `json:"style,omitempty"`
    Tension          float64     `json:"tension,omitempty"`
    Text             string      `json:"text,omitempty"`
    Theta            float64     `json:"theta,omitempty"`
    Type             interface{} `json:"type"`
}

// MarkPropFieldDefWithCondition A FieldDef with Condition<ValueDef>
// {
//    condition: {value: ...},
//    field: ...,
//    ...
// }
type MarkPropFieldDefWithCondition struct {
    Aggregate interface{} `json:"aggregate,omitempty"`
    Bin       interface{} `json:"bin,omitempty"`
    Condition interface{} `json:"condition,omitempty"`
    Field     interface{} `json:"field,omitempty"`
    Legend    interface{} `json:"legend,omitempty"`
    Scale     *Scale      `json:"scale,omitempty"`
    Sort      interface{} `json:"sort,omitempty"`
    TimeUnit  interface{} `json:"timeUnit,omitempty"`
    Type      interface{} `json:"type"`
}

// MarkPropValueDefWithCondition A ValueDef with Condition<ValueDef | FieldDef>
// {
//    condition: {field: ...} | {value: ...},
//    value: ...,
// }
type MarkPropValueDefWithCondition struct {
    Condition interface{} `json:"condition,omitempty"`
    Value     interface{} `json:"value,omitempty"`
}

// MultiSelection
type MultiSelection struct {
    Empty     string        `json:"empty,omitempty"`
    Encodings []interface{} `json:"encodings,omitempty"`
    Fields    []string      `json:"fields,omitempty"`
    Nearest   bool          `json:"nearest,omitempty"`
    On        interface{}   `json:"on,omitempty"`
    Resolve   interface{}   `json:"resolve,omitempty"`
    Toggle    interface{}   `json:"toggle,omitempty"`
    Type      string        `json:"type"`
}

// MultiSelectionConfig
type MultiSelectionConfig struct {
    Empty     string        `json:"empty,omitempty"`
    Encodings []interface{} `json:"encodings,omitempty"`
    Fields    []string      `json:"fields,omitempty"`
    Nearest   bool          `json:"nearest,omitempty"`
    On        interface{}   `json:"on,omitempty"`
    Resolve   interface{}   `json:"resolve,omitempty"`
    Toggle    interface{}   `json:"toggle,omitempty"`
}

// NamedData
type NamedData struct {
    Format interface{} `json:"format,omitempty"`
    Name   string      `json:"name"`
}

// NotFilter
type NotFilter struct {
    Not interface{} `json:"not"`
}

// OneOfFilter
type OneOfFilter struct {
    Field    string      `json:"field"`
    OneOf    interface{} `json:"oneOf"`
    TimeUnit interface{} `json:"timeUnit,omitempty"`
}

// OrFilter
type OrFilter struct {
    Or []interface{} `json:"or"`
}

// OrderFieldDef
type OrderFieldDef struct {
    Aggregate interface{} `json:"aggregate,omitempty"`
    Bin       interface{} `json:"bin,omitempty"`
    Field     interface{} `json:"field,omitempty"`
    Sort      interface{} `json:"sort,omitempty"`
    TimeUnit  interface{} `json:"timeUnit,omitempty"`
    Type      interface{} `json:"type"`
}

// PositionFieldDef
type PositionFieldDef struct {
    Aggregate interface{} `json:"aggregate,omitempty"`
    Axis      interface{} `json:"axis,omitempty"`
    Bin       interface{} `json:"bin,omitempty"`
    Field     interface{} `json:"field,omitempty"`
    Scale     *Scale      `json:"scale,omitempty"`
    Sort      interface{} `json:"sort,omitempty"`
    Stack     interface{} `json:"stack,omitempty"`
    TimeUnit  interface{} `json:"timeUnit,omitempty"`
    Type      interface{} `json:"type"`
}

// RangeConfig
type RangeConfig struct {
    Category  interface{} `json:"category,omitempty"`
    Diverging interface{} `json:"diverging,omitempty"`
    Heatmap   interface{} `json:"heatmap,omitempty"`
    Ordinal   interface{} `json:"ordinal,omitempty"`
    Ramp      interface{} `json:"ramp,omitempty"`
    Symbol    []string    `json:"symbol,omitempty"`
}

// RangeFilter
type RangeFilter struct {
    Field    string        `json:"field"`
    Range    []interface{} `json:"range"`
    TimeUnit interface{}   `json:"timeUnit,omitempty"`
}

// Repeat
type Repeat struct {
    Column []string `json:"column,omitempty"`
    Row    []string `json:"row,omitempty"`
}

// RepeatRef Reference to a repeated value.
type RepeatRef struct {
    Repeat string `json:"repeat"`
}

// RepeatSpec
type RepeatSpec struct {
    Data        interface{}   `json:"data,omitempty"`
    Description string        `json:"description,omitempty"`
    Name        string        `json:"name,omitempty"`
    Repeat      *Repeat       `json:"repeat"`
    Resolve     *Resolve      `json:"resolve,omitempty"`
    Spec        interface{}   `json:"spec"`
    Title       interface{}   `json:"title,omitempty"`
    Transform   []interface{} `json:"transform,omitempty"`
}

// Resolve Defines how scales, axes, and legends from different specs should be combined. Resolve is a mapping from `scale`, `axis`, and `legend` to a mapping from channels to resolutions.
type Resolve struct {
    Axis   *AxisResolveMap   `json:"axis,omitempty"`
    Legend *LegendResolveMap `json:"legend,omitempty"`
    Scale  *ScaleResolveMap  `json:"scale,omitempty"`
}

// Scale
type Scale struct {
    Base         float64     `json:"base,omitempty"`
    Clamp        bool        `json:"clamp,omitempty"`
    Domain       interface{} `json:"domain,omitempty"`
    Exponent     float64     `json:"exponent,omitempty"`
    Interpolate  interface{} `json:"interpolate,omitempty"`
    Nice         interface{} `json:"nice,omitempty"`
    Padding      float64     `json:"padding,omitempty"`
    PaddingInner float64     `json:"paddingInner,omitempty"`
    PaddingOuter float64     `json:"paddingOuter,omitempty"`
    Range        interface{} `json:"range,omitempty"`
    RangeStep    interface{} `json:"rangeStep,omitempty"`
    Round        bool        `json:"round,omitempty"`
    Scheme       interface{} `json:"scheme,omitempty"`
    Type         interface{} `json:"type,omitempty"`
    Zero         bool        `json:"zero,omitempty"`
}

// ScaleConfig
type ScaleConfig struct {
    BandPaddingInner      float64     `json:"bandPaddingInner,omitempty"`
    BandPaddingOuter      float64     `json:"bandPaddingOuter,omitempty"`
    Clamp                 bool        `json:"clamp,omitempty"`
    ContinuousPadding     float64     `json:"continuousPadding,omitempty"`
    MaxBandSize           float64     `json:"maxBandSize,omitempty"`
    MaxFontSize           float64     `json:"maxFontSize,omitempty"`
    MaxOpacity            float64     `json:"maxOpacity,omitempty"`
    MaxSize               float64     `json:"maxSize,omitempty"`
    MaxStrokeWidth        float64     `json:"maxStrokeWidth,omitempty"`
    MinBandSize           float64     `json:"minBandSize,omitempty"`
    MinFontSize           float64     `json:"minFontSize,omitempty"`
    MinOpacity            float64     `json:"minOpacity,omitempty"`
    MinSize               float64     `json:"minSize,omitempty"`
    MinStrokeWidth        float64     `json:"minStrokeWidth,omitempty"`
    PointPadding          float64     `json:"pointPadding,omitempty"`
    RangeStep             interface{} `json:"rangeStep,omitempty"`
    Round                 bool        `json:"round,omitempty"`
    TextXRangeStep        float64     `json:"textXRangeStep,omitempty"`
    UseUnaggregatedDomain bool        `json:"useUnaggregatedDomain,omitempty"`
}

// ScaleResolveMap
type ScaleResolveMap struct {
    Color   interface{} `json:"color,omitempty"`
    Opacity interface{} `json:"opacity,omitempty"`
    Shape   interface{} `json:"shape,omitempty"`
    Size    interface{} `json:"size,omitempty"`
    X       interface{} `json:"x,omitempty"`
    Y       interface{} `json:"y,omitempty"`
}

// SchemeParams
type SchemeParams struct {
    Extent []float64 `json:"extent,omitempty"`
    Name   string    `json:"name"`
}

// SelectionAnd
type SelectionAnd struct {
    And []interface{} `json:"and"`
}

// SelectionConfig
type SelectionConfig struct {
    Interval *IntervalSelectionConfig `json:"interval,omitempty"`
    Multi    *MultiSelectionConfig    `json:"multi,omitempty"`
    Single   *SingleSelectionConfig   `json:"single,omitempty"`
}

// SelectionFilter
type SelectionFilter struct {
    Selection interface{} `json:"selection"`
}

// SelectionNot
type SelectionNot struct {
    Not interface{} `json:"not"`
}

// SelectionOr
type SelectionOr struct {
    Or []interface{} `json:"or"`
}

// SingleSelection
type SingleSelection struct {
    Bind      interface{}   `json:"bind,omitempty"`
    Empty     string        `json:"empty,omitempty"`
    Encodings []interface{} `json:"encodings,omitempty"`
    Fields    []string      `json:"fields,omitempty"`
    Nearest   bool          `json:"nearest,omitempty"`
    On        interface{}   `json:"on,omitempty"`
    Resolve   interface{}   `json:"resolve,omitempty"`
    Type      string        `json:"type"`
}

// SingleSelectionConfig
type SingleSelectionConfig struct {
    Bind      interface{}   `json:"bind,omitempty"`
    Empty     string        `json:"empty,omitempty"`
    Encodings []interface{} `json:"encodings,omitempty"`
    Fields    []string      `json:"fields,omitempty"`
    Nearest   bool          `json:"nearest,omitempty"`
    On        interface{}   `json:"on,omitempty"`
    Resolve   interface{}   `json:"resolve,omitempty"`
}

// SortField
type SortField struct {
    Field interface{} `json:"field,omitempty"`
    Op    interface{} `json:"op"`
    Order interface{} `json:"order,omitempty"`
}

// TextConfig
type TextConfig struct {
    Align            interface{} `json:"align,omitempty"`
    Angle            float64     `json:"angle,omitempty"`
    Baseline         interface{} `json:"baseline,omitempty"`
    Color            string      `json:"color,omitempty"`
    Dx               float64     `json:"dx,omitempty"`
    Dy               float64     `json:"dy,omitempty"`
    Fill             string      `json:"fill,omitempty"`
    FillOpacity      float64     `json:"fillOpacity,omitempty"`
    Filled           bool        `json:"filled,omitempty"`
    Font             string      `json:"font,omitempty"`
    FontSize         float64     `json:"fontSize,omitempty"`
    FontStyle        interface{} `json:"fontStyle,omitempty"`
    FontWeight       interface{} `json:"fontWeight,omitempty"`
    Interpolate      interface{} `json:"interpolate,omitempty"`
    Limit            float64     `json:"limit,omitempty"`
    Opacity          float64     `json:"opacity,omitempty"`
    Orient           interface{} `json:"orient,omitempty"`
    Radius           float64     `json:"radius,omitempty"`
    Shape            string      `json:"shape,omitempty"`
    ShortTimeLabels  bool        `json:"shortTimeLabels,omitempty"`
    Size             float64     `json:"size,omitempty"`
    Stroke           string      `json:"stroke,omitempty"`
    StrokeDash       []float64   `json:"strokeDash,omitempty"`
    StrokeDashOffset float64     `json:"strokeDashOffset,omitempty"`
    StrokeOpacity    float64     `json:"strokeOpacity,omitempty"`
    StrokeWidth      float64     `json:"strokeWidth,omitempty"`
    Tension          float64     `json:"tension,omitempty"`
    Text             string      `json:"text,omitempty"`
    Theta            float64     `json:"theta,omitempty"`
}

// TextFieldDefWithCondition A FieldDef with Condition<ValueDef>
// {
//    condition: {value: ...},
//    field: ...,
//    ...
// }
type TextFieldDefWithCondition struct {
    Aggregate interface{} `json:"aggregate,omitempty"`
    Bin       interface{} `json:"bin,omitempty"`
    Condition interface{} `json:"condition,omitempty"`
    Field     interface{} `json:"field,omitempty"`
    Format    string      `json:"format,omitempty"`
    TimeUnit  interface{} `json:"timeUnit,omitempty"`
    Type      interface{} `json:"type"`
}

// TextValueDefWithCondition A ValueDef with Condition<ValueDef | FieldDef>
// {
//    condition: {field: ...} | {value: ...},
//    value: ...,
// }
type TextValueDefWithCondition struct {
    Condition interface{} `json:"condition,omitempty"`
    Value     interface{} `json:"value,omitempty"`
}

// TickConfig
type TickConfig struct {
    Align            interface{} `json:"align,omitempty"`
    Angle            float64     `json:"angle,omitempty"`
    BandSize         float64     `json:"bandSize,omitempty"`
    Baseline         interface{} `json:"baseline,omitempty"`
    Color            string      `json:"color,omitempty"`
    Dx               float64     `json:"dx,omitempty"`
    Dy               float64     `json:"dy,omitempty"`
    Fill             string      `json:"fill,omitempty"`
    FillOpacity      float64     `json:"fillOpacity,omitempty"`
    Filled           bool        `json:"filled,omitempty"`
    Font             string      `json:"font,omitempty"`
    FontSize         float64     `json:"fontSize,omitempty"`
    FontStyle        interface{} `json:"fontStyle,omitempty"`
    FontWeight       interface{} `json:"fontWeight,omitempty"`
    Interpolate      interface{} `json:"interpolate,omitempty"`
    Limit            float64     `json:"limit,omitempty"`
    Opacity          float64     `json:"opacity,omitempty"`
    Orient           interface{} `json:"orient,omitempty"`
    Radius           float64     `json:"radius,omitempty"`
    Shape            string      `json:"shape,omitempty"`
    Size             float64     `json:"size,omitempty"`
    Stroke           string      `json:"stroke,omitempty"`
    StrokeDash       []float64   `json:"strokeDash,omitempty"`
    StrokeDashOffset float64     `json:"strokeDashOffset,omitempty"`
    StrokeOpacity    float64     `json:"strokeOpacity,omitempty"`
    StrokeWidth      float64     `json:"strokeWidth,omitempty"`
    Tension          float64     `json:"tension,omitempty"`
    Text             string      `json:"text,omitempty"`
    Theta            float64     `json:"theta,omitempty"`
    Thickness        float64     `json:"thickness,omitempty"`
}

// TimeUnitTransform
type TimeUnitTransform struct {
    As       string      `json:"as"`
    Field    string      `json:"field"`
    TimeUnit interface{} `json:"timeUnit"`
}

// TitleParams
type TitleParams struct {
    Anchor interface{} `json:"anchor,omitempty"`
    Offset float64     `json:"offset,omitempty"`
    Orient interface{} `json:"orient,omitempty"`
    Style  interface{} `json:"style,omitempty"`
    Text   string      `json:"text"`
}

// TopLevelFacetSpec
type TopLevelFacetSpec struct {
    Autosize    interface{}   `json:"autosize,omitempty"`
    Background  string        `json:"background,omitempty"`
    Config      *Config       `json:"config,omitempty"`
    Data        interface{}   `json:"data,omitempty"`
    Description string        `json:"description,omitempty"`
    Facet       *FacetMapping `json:"facet"`
    Name        string        `json:"name,omitempty"`
    Padding     interface{}   `json:"padding,omitempty"`
    Resolve     *Resolve      `json:"resolve,omitempty"`
    Schema      string        `json:"$schema,omitempty"`
    Spec        interface{}   `json:"spec"`
    Title       interface{}   `json:"title,omitempty"`
    Transform   []interface{} `json:"transform,omitempty"`
}

// TopLevelFacetedUnitSpec
type TopLevelFacetedUnitSpec struct {
    Autosize    interface{}            `json:"autosize,omitempty"`
    Background  string                 `json:"background,omitempty"`
    Config      *Config                `json:"config,omitempty"`
    Data        interface{}            `json:"data,omitempty"`
    Description string                 `json:"description,omitempty"`
    Encoding    *EncodingWithFacet     `json:"encoding"`
    Height      float64                `json:"height,omitempty"`
    Mark        interface{}            `json:"mark"`
    Name        string                 `json:"name,omitempty"`
    Padding     interface{}            `json:"padding,omitempty"`
    Schema      string                 `json:"$schema,omitempty"`
    Selection   map[string]interface{} `json:"selection,omitempty"`
    Title       interface{}            `json:"title,omitempty"`
    Transform   []interface{}          `json:"transform,omitempty"`
    Width       float64                `json:"width,omitempty"`
}

// TopLevelHConcatSpec
type TopLevelHConcatSpec struct {
    Autosize    interface{}   `json:"autosize,omitempty"`
    Background  string        `json:"background,omitempty"`
    Config      *Config       `json:"config,omitempty"`
    Data        interface{}   `json:"data,omitempty"`
    Description string        `json:"description,omitempty"`
    Hconcat     []interface{} `json:"hconcat"`
    Name        string        `json:"name,omitempty"`
    Padding     interface{}   `json:"padding,omitempty"`
    Resolve     *Resolve      `json:"resolve,omitempty"`
    Schema      string        `json:"$schema,omitempty"`
    Title       interface{}   `json:"title,omitempty"`
    Transform   []interface{} `json:"transform,omitempty"`
}

// TopLevelLayerSpec
type TopLevelLayerSpec struct {
    Autosize    interface{}   `json:"autosize,omitempty"`
    Background  string        `json:"background,omitempty"`
    Config      *Config       `json:"config,omitempty"`
    Data        interface{}   `json:"data,omitempty"`
    Description string        `json:"description,omitempty"`
    Height      float64       `json:"height,omitempty"`
    Layer       []interface{} `json:"layer"`
    Name        string        `json:"name,omitempty"`
    Padding     interface{}   `json:"padding,omitempty"`
    Resolve     *Resolve      `json:"resolve,omitempty"`
    Schema      string        `json:"$schema,omitempty"`
    Title       interface{}   `json:"title,omitempty"`
    Transform   []interface{} `json:"transform,omitempty"`
    Width       float64       `json:"width,omitempty"`
}

// TopLevelRepeatSpec
type TopLevelRepeatSpec struct {
    Autosize    interface{}   `json:"autosize,omitempty"`
    Background  string        `json:"background,omitempty"`
    Config      *Config       `json:"config,omitempty"`
    Data        interface{}   `json:"data,omitempty"`
    Description string        `json:"description,omitempty"`
    Name        string        `json:"name,omitempty"`
    Padding     interface{}   `json:"padding,omitempty"`
    Repeat      *Repeat       `json:"repeat"`
    Resolve     *Resolve      `json:"resolve,omitempty"`
    Schema      string        `json:"$schema,omitempty"`
    Spec        interface{}   `json:"spec"`
    Title       interface{}   `json:"title,omitempty"`
    Transform   []interface{} `json:"transform,omitempty"`
}

// TopLevelVConcatSpec
type TopLevelVConcatSpec struct {
    Autosize    interface{}   `json:"autosize,omitempty"`
    Background  string        `json:"background,omitempty"`
    Config      *Config       `json:"config,omitempty"`
    Data        interface{}   `json:"data,omitempty"`
    Description string        `json:"description,omitempty"`
    Name        string        `json:"name,omitempty"`
    Padding     interface{}   `json:"padding,omitempty"`
    Resolve     *Resolve      `json:"resolve,omitempty"`
    Schema      string        `json:"$schema,omitempty"`
    Title       interface{}   `json:"title,omitempty"`
    Transform   []interface{} `json:"transform,omitempty"`
    Vconcat     []interface{} `json:"vconcat"`
}

// TopoDataFormat
type TopoDataFormat struct {
    Feature string      `json:"feature,omitempty"`
    Mesh    string      `json:"mesh,omitempty"`
    Parse   interface{} `json:"parse,omitempty"`
    Type    string      `json:"type,omitempty"`
}

// UrlData
type UrlData struct {
    Format interface{} `json:"format,omitempty"`
    Url    string      `json:"url"`
}

// VConcatSpec
type VConcatSpec struct {
    Data        interface{}   `json:"data,omitempty"`
    Description string        `json:"description,omitempty"`
    Name        string        `json:"name,omitempty"`
    Resolve     *Resolve      `json:"resolve,omitempty"`
    Title       interface{}   `json:"title,omitempty"`
    Transform   []interface{} `json:"transform,omitempty"`
    Vconcat     []interface{} `json:"vconcat"`
}

// ValueDef Definition object for a constant value of an encoding channel.
type ValueDef struct {
    Value interface{} `json:"value"`
}

// VgAxisConfig
type VgAxisConfig struct {
    BandPosition    float64     `json:"bandPosition,omitempty"`
    Domain          bool        `json:"domain,omitempty"`
    DomainColor     string      `json:"domainColor,omitempty"`
    DomainWidth     float64     `json:"domainWidth,omitempty"`
    Grid            bool        `json:"grid,omitempty"`
    GridColor       string      `json:"gridColor,omitempty"`
    GridDash        []float64   `json:"gridDash,omitempty"`
    GridOpacity     float64     `json:"gridOpacity,omitempty"`
    GridWidth       float64     `json:"gridWidth,omitempty"`
    LabelAngle      float64     `json:"labelAngle,omitempty"`
    LabelBound      interface{} `json:"labelBound,omitempty"`
    LabelColor      string      `json:"labelColor,omitempty"`
    LabelFlush      interface{} `json:"labelFlush,omitempty"`
    LabelFont       string      `json:"labelFont,omitempty"`
    LabelFontSize   float64     `json:"labelFontSize,omitempty"`
    LabelLimit      float64     `json:"labelLimit,omitempty"`
    LabelOverlap    interface{} `json:"labelOverlap,omitempty"`
    LabelPadding    float64     `json:"labelPadding,omitempty"`
    Labels          bool        `json:"labels,omitempty"`
    MaxExtent       float64     `json:"maxExtent,omitempty"`
    MinExtent       float64     `json:"minExtent,omitempty"`
    TickColor       string      `json:"tickColor,omitempty"`
    TickRound       bool        `json:"tickRound,omitempty"`
    TickSize        float64     `json:"tickSize,omitempty"`
    TickWidth       float64     `json:"tickWidth,omitempty"`
    Ticks           bool        `json:"ticks,omitempty"`
    TitleAlign      string      `json:"titleAlign,omitempty"`
    TitleAngle      float64     `json:"titleAngle,omitempty"`
    TitleBaseline   string      `json:"titleBaseline,omitempty"`
    TitleColor      string      `json:"titleColor,omitempty"`
    TitleFont       string      `json:"titleFont,omitempty"`
    TitleFontSize   float64     `json:"titleFontSize,omitempty"`
    TitleFontWeight interface{} `json:"titleFontWeight,omitempty"`
    TitleLimit      float64     `json:"titleLimit,omitempty"`
    TitleMaxLength  float64     `json:"titleMaxLength,omitempty"`
    TitlePadding    float64     `json:"titlePadding,omitempty"`
    TitleX          float64     `json:"titleX,omitempty"`
    TitleY          float64     `json:"titleY,omitempty"`
}

// VgCheckboxBinding
type VgCheckboxBinding struct {
    Element string `json:"element,omitempty"`
    Input   string `json:"input"`
}

// VgGenericBinding
type VgGenericBinding struct {
    Element string `json:"element,omitempty"`
    Input   string `json:"input"`
}

// VgMarkConfig
type VgMarkConfig struct {
    Align            interface{} `json:"align,omitempty"`
    Angle            float64     `json:"angle,omitempty"`
    Baseline         interface{} `json:"baseline,omitempty"`
    Dx               float64     `json:"dx,omitempty"`
    Dy               float64     `json:"dy,omitempty"`
    Fill             string      `json:"fill,omitempty"`
    FillOpacity      float64     `json:"fillOpacity,omitempty"`
    Font             string      `json:"font,omitempty"`
    FontSize         float64     `json:"fontSize,omitempty"`
    FontStyle        interface{} `json:"fontStyle,omitempty"`
    FontWeight       interface{} `json:"fontWeight,omitempty"`
    Interpolate      interface{} `json:"interpolate,omitempty"`
    Limit            float64     `json:"limit,omitempty"`
    Opacity          float64     `json:"opacity,omitempty"`
    Orient           interface{} `json:"orient,omitempty"`
    Radius           float64     `json:"radius,omitempty"`
    Shape            string      `json:"shape,omitempty"`
    Size             float64     `json:"size,omitempty"`
    Stroke           string      `json:"stroke,omitempty"`
    StrokeDash       []float64   `json:"strokeDash,omitempty"`
    StrokeDashOffset float64     `json:"strokeDashOffset,omitempty"`
    StrokeOpacity    float64     `json:"strokeOpacity,omitempty"`
    StrokeWidth      float64     `json:"strokeWidth,omitempty"`
    Tension          float64     `json:"tension,omitempty"`
    Text             string      `json:"text,omitempty"`
    Theta            float64     `json:"theta,omitempty"`
}

// VgRadioBinding
type VgRadioBinding struct {
    Element string   `json:"element,omitempty"`
    Input   string   `json:"input"`
    Options []string `json:"options"`
}

// VgRangeBinding
type VgRangeBinding struct {
    Element string  `json:"element,omitempty"`
    Input   string  `json:"input"`
    Max     float64 `json:"max,omitempty"`
    Min     float64 `json:"min,omitempty"`
    Step    float64 `json:"step,omitempty"`
}

// VgScheme
type VgScheme struct {
    Count  float64   `json:"count,omitempty"`
    Extent []float64 `json:"extent,omitempty"`
    Scheme string    `json:"scheme"`
}

// VgSelectBinding
type VgSelectBinding struct {
    Element string   `json:"element,omitempty"`
    Input   string   `json:"input"`
    Options []string `json:"options"`
}

// VgTitleConfig
type VgTitleConfig struct {
    Anchor     interface{} `json:"anchor,omitempty"`
    Angle      float64     `json:"angle,omitempty"`
    Baseline   interface{} `json:"baseline,omitempty"`
    Color      string      `json:"color,omitempty"`
    Font       string      `json:"font,omitempty"`
    FontSize   float64     `json:"fontSize,omitempty"`
    FontWeight interface{} `json:"fontWeight,omitempty"`
    Limit      float64     `json:"limit,omitempty"`
    Offset     float64     `json:"offset,omitempty"`
    Orient     interface{} `json:"orient,omitempty"`
}

// ViewConfig
type ViewConfig struct {
    Clip             bool      `json:"clip,omitempty"`
    Fill             string    `json:"fill,omitempty"`
    FillOpacity      float64   `json:"fillOpacity,omitempty"`
    Height           float64   `json:"height,omitempty"`
    Stroke           string    `json:"stroke,omitempty"`
    StrokeDash       []float64 `json:"strokeDash,omitempty"`
    StrokeDashOffset float64   `json:"strokeDashOffset,omitempty"`
    StrokeOpacity    float64   `json:"strokeOpacity,omitempty"`
    StrokeWidth      float64   `json:"strokeWidth,omitempty"`
    Width            float64   `json:"width,omitempty"`
}
morangorin commented 6 years ago

That is great. This is definitely good enough to start experimenting. Thank you very much.