Current section
Files
Jump to
Current section
Files
lib/consul/event.ex
#
# The MIT License (MIT)
#
# Copyright (c) 2014-2015 Undead Labs, LLC
#
defmodule Consul.Event do
alias Consul.Endpoint
use Consul.Endpoint, handler: Consul.Handler.Base
defstruct id: nil,
name: nil,
payload: nil,
node_filter: nil,
service_filter: nil,
tag_filter: nil,
version: nil,
l_time: nil
@type t :: %{
id: binary,
name: binary,
payload: binary | nil,
service_filter: binary,
tag_filter: binary,
version: integer,
l_time: integer
}
@event "event"
@fire "fire"
@list "list"
@spec fire(binary, binary, Keyword.t()) :: Endpoint.response()
def fire(name, payload \\ "", opts \\ []) when is_binary(payload) do
build_url([@event, @fire, name], opts)
|> req_put(payload)
end
@doc """
Build a list of `Consul.Event` from the given `Consul.Response`.
"""
@spec from_response(Consul.Response.t()) :: [t]
def from_response(%{body: body}) when is_list(body) do
Enum.map(body, &build_event/1)
end
@doc """
Return the l_time of the most recent `Consul.Event` in the given list.
"""
@spec last_time([t]) :: integer | nil
def last_time([]), do: nil
def last_time(events) do
[%__MODULE__{l_time: time} | _] = sort(events)
time
end
@spec list(Keyword.t()) :: Endpoint.response()
def list(opts \\ []) do
build_url([@event, @list], opts)
|> req_get()
end
@doc """
Sort a list of `Consul.Event` by their `l_time` field.
"""
@spec sort([t]) :: [t]
def sort(events) do
Enum.sort(events, &(&1.l_time > &2.l_time))
end
#
# Private
#
defp build_event(%{
"ID" => id,
"Name" => name,
"Payload" => nil,
"NodeFilter" => node_filter,
"ServiceFilter" => service_filter,
"TagFilter" => tag_filter,
"Version" => version,
"LTime" => l_time
}) do
%Consul.Event{
id: id,
name: name,
payload: nil,
node_filter: node_filter,
service_filter: service_filter,
tag_filter: tag_filter,
version: version,
l_time: l_time
}
end
defp build_event(%{
"ID" => id,
"Name" => name,
"Payload" => payload,
"NodeFilter" => node_filter,
"ServiceFilter" => service_filter,
"TagFilter" => tag_filter,
"Version" => version,
"LTime" => l_time
}) do
%Consul.Event{
id: id,
name: name,
payload: :base64.decode(payload),
node_filter: node_filter,
service_filter: service_filter,
tag_filter: tag_filter,
version: version,
l_time: l_time
}
end
end