Packages

In-memory fleet state management

Current section

Files

Jump to
hive lib hive.ex
Raw

lib/hive.ex

defmodule Hive do
@moduledoc """
Efficient in-memory fleet state management
where each vehicle is a separate process
which manages it's own state and provides
APIs to access and use it.
Public API exposed under Hive module.
"""
use Hive.Base
import Hive.Vehicle.Helpers
@doc """
Infleet by `vehicle_id`, when vehicle infleeted
only by `vehicle_id` then the state of `VehicleWorker`
initialized as `%Vehicle{id: vehicle_id}`.
If you want to pass more metadata consider passing
`%Vehicle{}` struct instead of binary.
Will return `{:error, {:already_started, pid}}`.
"""
def infleet(vehicle_id) when is_binary(vehicle_id) do
VehicleSupervisor.infleet(%Vehicle{id: vehicle_id})
end
@doc """
Infleet `Vehicle`
Will return `{:error, {:already_started, pid}}`.
"""
def infleet(%Vehicle{} = vehicle) do
VehicleSupervisor.infleet(vehicle)
end
@doc """
Defleet by `vehicle_id`
then `{:error, :not_found}` returned.
"""
def defleet(vehicle_id) when is_binary(vehicle_id) do
VehicleSupervisor.defleet(%Vehicle{id: vehicle_id})
end
@doc """
Defleet `Vehicle` if not known
then `{:error, :not_found}` returned.
"""
def defleet(%Vehicle{} = vehicle) do
VehicleSupervisor.defleet(vehicle)
end
@doc """
Update position by `vehicle_id`
"""
def update_position(vehicle_id, %GeoPosition{} = position) do
VehicleWorker.update(:position, %Vehicle{id: vehicle_id}, position)
end
@doc """
Get position by `vehicle_id`
"""
def get_position(vehicle_id) do
%Vehicle{id: vehicle_id}
|> proc_name()
|> GenServer.call(:position)
end
@doc """
Get vehicle by `vehicle_id`
"""
def get_vehicle(vehicle_id) do
%Vehicle{id: vehicle_id}
|> proc_name()
|> GenServer.call(:get)
end
@doc """
Check if vehicle is known and supervised
"""
def alive?(vehicle_id) do
%Vehicle{id: vehicle_id}
|> make_name()
|> VehicleSupervisor.alive?()
end
end