newt/dump/syscfg.go (161 lines of code) (raw):

/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package dump import ( "sort" "mynewt.apache.org/newt/newt/syscfg" ) type SyscfgPoint struct { Value string `json:"value"` Pkg string `json:"package"` } type SyscfgRestriction struct { Code syscfg.CfgRestrictionCode `json:"code"` Expr string `json:"expr,omitempty"` } type SyscfgEntry struct { Type syscfg.CfgSettingType `json:"type"` History []SyscfgPoint `json:"history"` RefName string `json:"ref_name,omitempty"` Restrictions []SyscfgRestriction `json:"restrictions,omitempty"` State syscfg.CfgSettingState `json:"state"` } type SyscfgPriority struct { Name string `json:"name"` Definer string `json:"definer"` Overrider string `json:"overrider"` } type SyscfgFlashConflict struct { Settings []string `json:"settings"` Code syscfg.CfgFlashConflictCode `json:"code"` } type Syscfg struct { Settings map[string]SyscfgEntry `json:"settings"` PkgRestrictions map[string][]SyscfgRestriction `json:"pkg_restrictions"` Orphans map[string][]SyscfgPoint `json:"orphans"` Ambiguities map[string][]SyscfgPoint `json:"ambiguities"` SetViolations map[string][]SyscfgRestriction `json:"set_violations"` PkgViolations map[string][]SyscfgRestriction `json:"pkg_violations"` PrioViolations []SyscfgPriority `json:"prio_violations"` FlashConflicts []SyscfgFlashConflict `json:"flash_conflicts"` Redefines map[string][]string `json:"redefines"` Deprecated []string `json:"deprecated"` Defunct []string `json:"defunct"` UnresolvedRefs []string `json:"unresolved_refs"` } func convPoint(p syscfg.CfgPoint) SyscfgPoint { return SyscfgPoint{ Value: p.Value, Pkg: p.Name(), } } func convPointSlice(ps []syscfg.CfgPoint) []SyscfgPoint { slice := make([]SyscfgPoint, len(ps)) for i, p := range ps { slice[i] = convPoint(p) } return slice } func convStringMapPointSlice( src map[string][]syscfg.CfgPoint) map[string][]SyscfgPoint { dst := make(map[string][]SyscfgPoint, len(src)) for k, ps := range src { dst[k] = convPointSlice(ps) } return dst } func convRestriction(r syscfg.CfgRestriction) SyscfgRestriction { return SyscfgRestriction{ Code: r.Code, Expr: r.Expr, } } func convRestrictionSlice(rs []syscfg.CfgRestriction) []SyscfgRestriction { slice := make([]SyscfgRestriction, len(rs)) for i, r := range rs { slice[i] = convRestriction(r) } return slice } func convStringMapRestrictionSlice( src map[string][]syscfg.CfgRestriction) map[string][]SyscfgRestriction { dst := make(map[string][]SyscfgRestriction, len(src)) for k, rs := range src { dst[k] = convRestrictionSlice(rs) } return dst } func convPriority(p syscfg.CfgPriority) SyscfgPriority { return SyscfgPriority{ Name: p.SettingName, Definer: p.PackageDef.FullName(), Overrider: p.PackageSrc.FullName(), } } func convPrioritySlice(ps []syscfg.CfgPriority) []SyscfgPriority { slice := make([]SyscfgPriority, len(ps)) for i, p := range ps { slice[i] = convPriority(p) } return slice } func convFlashConflict(f syscfg.CfgFlashConflict) SyscfgFlashConflict { return SyscfgFlashConflict{ Settings: f.SettingNames, Code: f.Code, } } func convFlashConflictSlice( fs []syscfg.CfgFlashConflict) []SyscfgFlashConflict { slice := make([]SyscfgFlashConflict, len(fs)) for i, f := range fs { slice[i] = convFlashConflict(f) } return slice } func convStringMapToSlice(m map[string]struct{}) []string { slice := make([]string, 0, len(m)) for s, _ := range m { slice = append(slice, s) } sort.Strings(slice) return slice } func newSyscfg(cfg syscfg.Cfg) Syscfg { settings := make(map[string]SyscfgEntry, len(cfg.Settings)) for name, ce := range cfg.Settings { history := convPointSlice(ce.History) restrictions := make([]SyscfgRestriction, len(ce.Restrictions)) for i, r := range ce.Restrictions { restrictions[i] = SyscfgRestriction{ Code: r.Code, Expr: r.Expr, } } settings[name] = SyscfgEntry{ Type: ce.SettingType, History: history, RefName: ce.ValueRefName, Restrictions: restrictions, State: ce.State, } } redefines := make(map[string][]string, len(cfg.Redefines)) for sname, pkgmap := range cfg.Redefines { for lpkg, _ := range pkgmap { redefines[sname] = append(redefines[sname], lpkg.FullName()) } } return Syscfg{ Settings: settings, PkgRestrictions: convStringMapRestrictionSlice(cfg.PackageRestrictions), Orphans: convStringMapPointSlice(cfg.Orphans), Ambiguities: convStringMapPointSlice(cfg.Ambiguities), SetViolations: convStringMapRestrictionSlice(cfg.SettingViolations), PkgViolations: convStringMapRestrictionSlice(cfg.PackageViolations), PrioViolations: convPrioritySlice(cfg.PriorityViolations), FlashConflicts: convFlashConflictSlice(cfg.FlashConflicts), Redefines: redefines, Deprecated: convStringMapToSlice(cfg.Deprecated), Defunct: convStringMapToSlice(cfg.Defunct), UnresolvedRefs: convStringMapToSlice(cfg.UnresolvedValueRefs), } }