towerops/lib/snmpkit/snmp_lib/mib.ex
2026-01-23 12:52:17 -06:00

108 lines
3.4 KiB
Elixir

defmodule SnmpKit.SnmpLib.MIB do
@moduledoc """
SNMP MIB compiler with enhanced Elixir ergonomics.
Provides a clean, functional API for compiling MIB files with proper
error handling, logging, and performance optimizations.
This module serves as the main entry point for MIB compilation operations.
"""
alias SnmpKit.SnmpLib.MIB.Compiler
alias SnmpKit.SnmpLib.MIB.Error
@type compile_opts :: [
output_dir: Path.t(),
include_dirs: [Path.t()],
log_level: Logger.level(),
format: :elixir | :erlang | :both,
optimize: boolean(),
warnings_as_errors: boolean(),
vendor_quirks: boolean()
]
@type compiled_mib :: %{
name: binary(),
objects_count: non_neg_integer(),
output_path: Path.t(),
compilation_time: non_neg_integer(),
metadata: map()
}
@type error :: term()
@type warning :: term()
@type compile_result ::
{:ok, compiled_mib()}
| {:error, [error()]}
| {:warning, compiled_mib(), [warning()]}
@doc """
Compile a MIB file to Elixir code.
## Options
- `:output_dir` - Directory for generated files (default: "./lib/generated")
- `:include_dirs` - Directories to search for imported MIBs (default: ["./priv/mibs"])
- `:log_level` - Logging verbosity (default: `:info`)
- `:format` - Output format `:elixir`, `:erlang`, or `:both` (default: `:elixir`)
- `:optimize` - Enable performance optimizations (default: `true`)
- `:warnings_as_errors` - Treat warnings as compilation errors (default: `false`)
- `:vendor_quirks` - Enable vendor-specific MIB compatibility (default: `true`)
## Examples
iex> SnmpKit.SnmpLib.MIB.compile("priv/mibs/RFC1213-MIB.txt")
{:error, [%SnmpKit.SnmpLib.MIB.Error{type: :file_not_found, ...}]}
"""
@spec compile(Path.t() | binary(), compile_opts()) :: {:error, [Error.t()]}
def compile(mib_source, opts \\ []) do
Compiler.compile(mib_source, opts)
end
@doc """
Compile MIB content from a string.
Useful when the MIB content is already loaded or generated dynamically.
## Examples
iex> mib_content = File.read!("RFC1213-MIB.txt")
iex> SnmpKit.SnmpLib.MIB.compile_string(mib_content)
{:ok, %{name: "RFC1213-MIB", ...}}
"""
@spec compile_string(binary(), compile_opts()) :: {:error, [Error.t()]}
def compile_string(mib_content, opts \\ []) do
Compiler.compile_string(mib_content, opts)
end
@doc """
Load a previously compiled MIB module.
## Examples
iex> SnmpKit.SnmpLib.MIB.load_compiled("lib/generated/rfc1213_mib.ex")
{:ok, %{name: "RFC1213-MIB", ...}}
"""
@spec load_compiled(Path.t()) :: {:ok, compiled_mib()} | {:error, term()}
def load_compiled(compiled_path) do
Compiler.load_compiled(compiled_path)
end
@doc """
Compile multiple MIB files in dependency order.
Automatically resolves import dependencies and compiles MIBs in the correct order.
## Examples
iex> mibs = ["SNMPv2-SMI.txt", "SNMPv2-TC.txt", "RFC1213-MIB.txt"]
iex> SnmpKit.SnmpLib.MIB.compile_all(mibs)
{:ok, [%{name: "SNMPv2-SMI", ...}, %{name: "SNMPv2-TC", ...}, ...]}
"""
@spec compile_all([Path.t()], compile_opts()) ::
{:ok, [compiled_mib()]} | {:error, [{Path.t(), [error()]}]}
def compile_all(mib_files, opts \\ []) do
Compiler.compile_all(mib_files, opts)
end
end