1package vnext23import (4 "fmt"5 "slices"6)78// PresentedFeature is the scene-facing projection of one semantic feature.9type PresentedFeature struct {10 FeatureID string11 LayerID string12 StyleID string13 Legend string14 Symbol string15 Stroke string16 Fill string17 Geometry Geometry18 Properties []Property19}2021// Present applies replaceable layer, style, and legend intent to a world's22// semantic feature graph.23func Present(world World) ([]PresentedFeature, error) {24 sets := make(map[string]FeatureSet, len(world.FeatureSets))25 for _, set := range world.FeatureSets {26 sets[set.ID] = set27 }28 styles := make(map[string]Style, len(world.Presentation.Styles))29 for _, style := range world.Presentation.Styles {30 styles[style.ID] = style31 }32 legend := make(map[string]string, len(world.Presentation.Legend))33 for _, entry := range world.Presentation.Legend {34 legend[entry.Layer] = entry.Label35 }36 layers := append([]Layer(nil), world.Presentation.Layers...)37 slices.SortStableFunc(layers, func(left, right Layer) int {38 if left.Order < right.Order {39 return -140 }41 if left.Order > right.Order {42 return 143 }44 return 045 })46 var presented []PresentedFeature47 for _, layer := range layers {48 set, held := sets[layer.FeatureSet]49 if !held {50 return nil, fmt.Errorf("layer %s refers to unknown feature set %s", layer.ID, layer.FeatureSet)51 }52 style, held := styles[layer.Style]53 if !held {54 return nil, fmt.Errorf("layer %s refers to unknown style %s", layer.ID, layer.Style)55 }56 for _, feature := range set.Features {57 presented = append(presented, PresentedFeature{58 FeatureID: feature.ID, LayerID: layer.ID, StyleID: style.ID, Legend: legend[layer.ID],59 Symbol: style.Symbol, Stroke: style.Stroke, Fill: style.Fill,60 Geometry: feature.Geometry, Properties: append([]Property(nil), feature.Properties...),61 })62 }63 }64 return presented, nil65}