rabbitmq-server/deps/rabbitmq_cli/lib/rabbitmq/cli/formatters/csv.ex

125 lines
3.3 KiB
Elixir
Raw Normal View History

2016-11-15 19:14:44 +08:00
## The contents of this file are subject to the Mozilla Public License
## Version 1.1 (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.mozilla.org/MPL/
##
## Software distributed under the License is distributed on an "AS IS"
## basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
## the License for the specific language governing rights and
## limitations under the License.
##
## The Original Code is RabbitMQ.
##
## The Initial Developer of the Original Code is GoPivotal, Inc.
2017-01-10 22:42:40 +08:00
## Copyright (c) 2007-2017 Pivotal Software, Inc. All rights reserved.
2016-11-15 19:14:44 +08:00
alias RabbitMQ.CLI.Formatters.FormatterHelpers, as: FormatterHelpers
defmodule RabbitMQ.CLI.Formatters.Csv do
@behaviour RabbitMQ.CLI.FormatterBehaviour
def format_stream(stream, _) do
## Flatten list_consumers
Stream.flat_map(stream,
fn({:error, msg}) ->
[{:error, msg}];
([first | _] = element) ->
case Keyword.keyword?(first) or is_map(first) do
true -> element;
false -> [element]
end
(other) ->
2016-11-18 00:09:18 +08:00
[other]
2016-11-15 19:14:44 +08:00
end)
## Add info_items names
|> Stream.transform(:init,
fn
({:error, msg}, _) ->
{:error, msg};
(element, :init) ->
{
case keys(element) do
nil -> [values(element)];
ks -> [ks, values(element)]
end,
:next
};
(element, :next) ->
{[values(element)], :next}
end)
|> CSV.encode([delimiter: ""])
end
def format_output(output, _) do
case keys(output) do
nil -> [values(output)];
ks -> [ks, values(output)]
end
|> CSV.encode
end
def keys(map) when is_map(map) do
Map.keys(map)
end
def keys(list) when is_list(list) do
case Keyword.keyword?(list) do
true -> Keyword.keys(list);
false -> nil
end
end
def keys(_other) do
nil
end
def values(map) when is_map(map) do
Map.values(map)
end
def values([]) do
[]
end
def values(list) when is_list(list) do
case Keyword.keyword?(list) do
true -> Keyword.values(list);
false -> list
end
end
def values(other) do
other
end
end
defimpl CSV.Encode, for: PID do
def encode(pid, env \\ []) do
2016-11-15 19:31:59 +08:00
FormatterHelpers.format_info_item(pid)
|> to_string
|> CSV.Encode.encode(env)
2016-11-15 19:14:44 +08:00
end
end
defimpl CSV.Encode, for: List do
2016-11-15 19:31:59 +08:00
def encode(list, env \\ []) do
FormatterHelpers.format_info_item(list)
|> to_string
2016-11-15 19:14:44 +08:00
|> CSV.Encode.encode(env)
end
2016-11-15 19:31:59 +08:00
end
defimpl CSV.Encode, for: Tuple do
def encode(tuple, env \\ []) do
FormatterHelpers.format_info_item(tuple)
|> to_string
|> CSV.Encode.encode(env)
2016-11-15 19:14:44 +08:00
end
end
2016-11-15 19:31:59 +08:00
defimpl CSV.Encode, for: Map do
def encode(map, env \\ []) do
FormatterHelpers.format_info_item(map)
|> to_string
|> CSV.Encode.encode(env)
end
end