1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
## This Source Code Form is subject to the terms of the Mozilla Public
## License, v. 2.0. If a copy of the MPL was not distributed with this
## file, You can obtain one at https://mozilla.org/MPL/2.0/.
##
## Copyright (c) 2007-2023 Broadcom. All Rights Reserved. The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. All rights reserved.
defmodule RabbitMQ.CLI.Ctl.InfoKeys do
import RabbitCommon.Records
alias RabbitMQ.CLI.Core.DataCoercion
# internal to requested keys
@type info_keys :: [atom | tuple]
# requested to internal keys
@type aliases :: keyword(atom)
def validate_info_keys(args, valid_keys) do
validate_info_keys(args, valid_keys, [])
end
@spec validate_info_keys([charlist], [charlist | atom], aliases) ::
{:ok, info_keys} | {:validation_failure, any}
def validate_info_keys(args, valid_keys, aliases) do
info_keys = prepare_info_keys(args, aliases)
case invalid_info_keys(info_keys, Enum.map(valid_keys, &DataCoercion.to_atom/1)) do
[_ | _] = bad_info_keys ->
{:validation_failure, {:bad_info_key, bad_info_keys}}
[] ->
{:ok, info_keys}
end
end
def prepare_info_keys(args) do
prepare_info_keys(args, [])
end
@spec prepare_info_keys([charlist], aliases) :: info_keys
def prepare_info_keys(args, aliases) do
args
|> Enum.flat_map(fn arg -> String.split(arg, ",", trim: true) end)
|> Enum.map(fn s -> String.replace(s, ",", "") end)
|> Enum.map(&String.trim/1)
|> Enum.map(&String.to_atom/1)
|> Enum.map(fn k ->
case Keyword.get(aliases, k) do
nil -> k
v -> {v, k}
end
end)
|> Enum.uniq()
|> :proplists.compact()
end
def broker_keys(info_keys) do
Enum.map(
info_keys,
fn
{k, _} -> k
k -> k
end
)
end
def with_valid_info_keys(args, valid_keys, fun) do
with_valid_info_keys(args, valid_keys, [], fun)
end
@spec with_valid_info_keys([charlist], [charlist], aliases, ([atom] -> any)) :: any
def with_valid_info_keys(args, valid_keys, aliases, fun) do
case validate_info_keys(args, valid_keys, aliases) do
{:ok, info_keys} -> fun.(:proplists.get_keys(info_keys))
err -> err
end
end
@spec invalid_info_keys(info_keys, [atom]) :: [atom]
defp invalid_info_keys(info_keys, valid_keys) do
info_keys
|> :proplists.get_keys()
|> MapSet.new()
|> MapSet.difference(MapSet.new(valid_keys))
|> MapSet.to_list()
|> Enum.map(fn k ->
case :proplists.get_value(k, info_keys, k) do
true -> k
v -> v
end
end)
end
@spec info_for_keys(keyword, info_keys) :: keyword
def info_for_keys(item, []) do
item
end
def info_for_keys([{_, _} | _] = item, info_keys) do
item
|> Enum.filter(fn {k, _} -> :proplists.is_defined(k, info_keys) end)
|> Enum.map(fn {k, v} ->
original =
case :proplists.get_value(k, info_keys) do
true -> k
v -> v
end
{original, format_info_item(v)}
end)
end
defp format_info_item(resource(name: name)) do
name
end
defp format_info_item(any) do
any
end
end
|