blob: 8b9205bf40afea7c68f9cb315d9247ad8493fa62 [file] [log] [blame]
/**
* 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),
}
}