defmodule Rudder do
@moduledoc """
Documentation for `Rudder`.
"""
alias Rudder.{
Request,
Client,
Identity,
Event,
Page,
Group,
Alias,
Screen,
Merge,
Batch,
Sendable,
Result
}
@type response() :: {:ok | :error, Result.t()}
@doc """
Sends an identity request to the RudderStack data plane
"""
@spec identify(Client.t(), Identity.t()) :: response()
def identify(client, %Identity{} = identity) do
Request.check_user_id!(identity)
request = %Request{
uri: "v1/identify",
params: Sendable.map_parameters(identity)
}
Client.send(client, request)
end
@doc """
Sends an event request to the RudderStack data plane
"""
@spec track(Client.t(), Event.t()) :: response()
def track(client, %Event{} = event) do
Request.check_user_id!(event)
request = %Request{
uri: "v1/track",
params: Sendable.map_parameters(event)
}
Client.send(client, request)
end
@doc """
Sends a page request to the RudderStack data plane
"""
@spec page(Client.t(), Page.t()) :: response()
def page(client, %Page{} = page) do
Request.check_user_id!(page)
request = %Request{
uri: "v1/page",
params: Sendable.map_parameters(page)
}
Client.send(client, request)
end
@doc """
Sends an alias request to the RudderStack data plane
"""
@spec alias(Client.t(), Alias.t()) :: response()
def alias(client, %Alias{} = user_alias) do
Request.check_user_id!(user_alias)
request = %Request{
uri: "v1/alias",
params: Sendable.map_parameters(user_alias)
}
Client.send(client, request)
end
@doc """
Sends a screen request to the RudderStack data plane
"""
@spec screen(Client.t(), Screen.t()) :: response()
def screen(client, %Screen{} = screen) do
Request.check_user_id!(screen)
request = %Request{
uri: "v1/screen",
params: Sendable.map_parameters(screen)
}
Client.send(client, request)
end
@doc """
Sends a group request to the RudderStack data plane
"""
@spec group(Client.t(), Group.t()) :: response()
def group(client, %Group{} = group) do
Request.check_user_id!(group)
request = %Request{
uri: "v1/group",
params: Sendable.map_parameters(group)
}
Client.send(client, request)
end
@doc """
Sends a merge request to the RudderStack data plane
"""
@spec merge(Client.t(), Merge.t()) :: response()
def merge(client, %Merge{} = merge) do
Request.check_user_id!(merge)
request = %Request{
uri: "v1/merge",
params: Sendable.map_parameters(merge)
}
Client.send(client, request)
end
@doc """
Sends a batch request to the RudderStack data plane
"""
@spec batch(Client.t(), Batch.t()) :: response()
def batch(client, %Batch{} = batch) do
validate_batch_items!(batch.items)
request = %Request{
uri: "v1/batch",
params: Sendable.map_parameters(batch)
}
Client.send(client, request)
end
@doc """
Check if a given string is nil, empty, or only whitespace
"""
@spec blank?(String.t()) :: boolean()
def blank?(nil), do: true
def blank?(str), do: String.trim(str) == ""
defp validate_batch_items!(items) do
:ok =
items
|> Enum.each(fn item ->
Request.check_user_id!(item)
Request.check_batch_type!(item)
end)
end
end