Phase 1: Foundation Types (100% complete)
- query_helpers: SQL LIKE sanitization with pipe operators
- numeric: Integer parsing with pattern matching guards
- result: Pure Elixir Result monad (map, and_then, unwrap_or)
Phase 2: Ecto Domain Types (100% complete)
- ip_address: IPv4/IPv6 validation using :inet directly
- mac_address: Multi-format MAC parsing (colon/hyphen/dot/compact)
- snmp_oid: OID parsing/manipulation with recursive pattern matching
All 198 tests passing across converted modules.
API changed from Gleam-style {:some/:none to idiomatic {:ok/:error.
Refactored parse_numeric_oid to use with statement, reducing nesting depth.
Reviewed-on: graham/towerops-web#196
27 lines
761 B
Elixir
27 lines
761 B
Elixir
alias Towerops.Agent.SnmpResult
|
|
|
|
result = %SnmpResult{
|
|
device_id: "550e8400-e29b-41d4-a716-446655440000",
|
|
job_type: :POLL,
|
|
job_id: "test",
|
|
timestamp: 1_234_567_890,
|
|
oid_values: %{"1.2.3" => "test"}
|
|
}
|
|
|
|
IO.puts("Original: #{inspect(result)}")
|
|
|
|
binary = SnmpResult.encode(result)
|
|
IO.puts("Encoded to #{byte_size(binary)} bytes")
|
|
|
|
case SnmpResult.decode(binary) do
|
|
{:ok, decoded} ->
|
|
IO.puts("Decoded successfully!")
|
|
IO.puts(" device_id: #{decoded.device_id}")
|
|
IO.puts(" job_type: #{inspect(decoded.job_type)}")
|
|
IO.puts(" job_id: #{decoded.job_id}")
|
|
IO.puts(" timestamp: #{decoded.timestamp}")
|
|
IO.puts(" oid_values: #{inspect(decoded.oid_values)}")
|
|
|
|
{:error, reason} ->
|
|
IO.puts("Decode failed: #{inspect(reason)}")
|
|
end
|