From 422719c34502c3ddcf4b3cd1dd8dfaf05d1bb850 Mon Sep 17 00:00:00 2001 From: James Shubin Date: Wed, 30 Oct 2024 00:58:10 -0400 Subject: [PATCH] lang: core: map: Add functions to extract keys and values Simple stuff, but now it's done! --- examples/lang/map-kv.mcl | 21 ++++++++++++ lang/core/map/map_keys.go | 66 +++++++++++++++++++++++++++++++++++++ lang/core/map/map_values.go | 66 +++++++++++++++++++++++++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 examples/lang/map-kv.mcl create mode 100644 lang/core/map/map_keys.go create mode 100644 lang/core/map/map_values.go diff --git a/examples/lang/map-kv.mcl b/examples/lang/map-kv.mcl new file mode 100644 index 00000000..71a22f2a --- /dev/null +++ b/examples/lang/map-kv.mcl @@ -0,0 +1,21 @@ +import "fmt" +import "map" + +$some_map = { + "ottawa" => 6, + "toronto" => 7, + "montreal" => 8, + "vancouver" => 9, +} + +print "keys" { + msg => fmt.printf("keys: %v", map.keys($some_map)), + + Meta:autogroup => false, +} + +print "values" { + msg => fmt.printf("values: %v", map.values($some_map)), + + Meta:autogroup => false, +} diff --git a/lang/core/map/map_keys.go b/lang/core/map/map_keys.go new file mode 100644 index 00000000..dcd50f46 --- /dev/null +++ b/lang/core/map/map_keys.go @@ -0,0 +1,66 @@ +// Mgmt +// Copyright (C) 2013-2024+ James Shubin and the project contributors +// Written by James Shubin and the project contributors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// Additional permission under GNU GPL version 3 section 7 +// +// If you modify this program, or any covered work, by linking or combining it +// with embedded mcl code and modules (and that the embedded mcl code and +// modules which link with this program, contain a copy of their source code in +// the authoritative form) containing parts covered by the terms of any other +// license, the licensors of this program grant you additional permission to +// convey the resulting work. Furthermore, the licensors of this program grant +// the original author, James Shubin, additional permission to update this +// additional permission if he deems it necessary to achieve the goals of this +// additional permission. + +package coremap + +import ( + "context" + "fmt" + + "github.com/purpleidea/mgmt/lang/funcs/simple" + "github.com/purpleidea/mgmt/lang/types" +) + +func init() { + simple.ModuleRegister(ModuleName, "keys", &simple.Scaffold{ + // TODO: Maybe saying ?0 could mean we don't care about that type? + T: types.NewType("func(x map{?1: ?2}) []?1"), + F: MapKeys, + }) +} + +// MapKeys returns a list of keys from the map. +func MapKeys(ctx context.Context, input []types.Value) (types.Value, error) { + m, ok := input[0].(*types.MapValue) + if !ok { + // programming error + return nil, fmt.Errorf("invalid map input") + } + + values := []types.Value{} + + for k := range m.V { + values = append(values, k) + } + + return &types.ListValue{ + T: types.NewType(fmt.Sprintf("[]%s", m.Type().Key)), + V: values, + }, nil +} diff --git a/lang/core/map/map_values.go b/lang/core/map/map_values.go new file mode 100644 index 00000000..cde41112 --- /dev/null +++ b/lang/core/map/map_values.go @@ -0,0 +1,66 @@ +// Mgmt +// Copyright (C) 2013-2024+ James Shubin and the project contributors +// Written by James Shubin and the project contributors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// Additional permission under GNU GPL version 3 section 7 +// +// If you modify this program, or any covered work, by linking or combining it +// with embedded mcl code and modules (and that the embedded mcl code and +// modules which link with this program, contain a copy of their source code in +// the authoritative form) containing parts covered by the terms of any other +// license, the licensors of this program grant you additional permission to +// convey the resulting work. Furthermore, the licensors of this program grant +// the original author, James Shubin, additional permission to update this +// additional permission if he deems it necessary to achieve the goals of this +// additional permission. + +package coremap + +import ( + "context" + "fmt" + + "github.com/purpleidea/mgmt/lang/funcs/simple" + "github.com/purpleidea/mgmt/lang/types" +) + +func init() { + simple.ModuleRegister(ModuleName, "values", &simple.Scaffold{ + // TODO: Maybe saying ?0 could mean we don't care about that type? + T: types.NewType("func(x map{?1: ?2}) []?2"), + F: MapValues, + }) +} + +// MapValues returns a list of values from the map. +func MapValues(ctx context.Context, input []types.Value) (types.Value, error) { + m, ok := input[0].(*types.MapValue) + if !ok { + // programming error + return nil, fmt.Errorf("invalid map input") + } + + values := []types.Value{} + + for _, v := range m.V { + values = append(values, v) + } + + return &types.ListValue{ + T: types.NewType(fmt.Sprintf("[]%s", m.Type().Val)), + V: values, + }, nil +}