# `Sigra.UAParser`
[🔗](https://github.com/sztheory/sigra/blob/v1.20.0/lib/sigra/ua_parser.ex#L1)

Lightweight user-agent string parser.

Extracts browser name, version, and operating system from User-Agent
header strings using regex matching. Designed for session display
("Chrome 120 on macOS") rather than comprehensive UA analysis.

## Supported Browsers

Edge, Opera, Samsung Internet, Chrome (including CriOS on iOS),
Firefox, Safari. Match order is significant: Edge and Opera are
checked before Chrome since their UA strings contain "Chrome".

## Supported Operating Systems

iOS, Android, Chrome OS, macOS, Windows, Linux.

# `parsed`

```elixir
@type parsed() :: %{
  browser: String.t(),
  browser_version: String.t() | nil,
  os: String.t()
}
```

# `friendly_name`
*since 0.1.0* 

```elixir
@spec friendly_name(parsed()) :: String.t()
```

Returns a human-readable name from a parsed user-agent map.

## Examples

    iex> Sigra.UAParser.friendly_name(%{browser: "Chrome", browser_version: "120", os: "macOS"})
    "Chrome 120 on macOS"

    iex> Sigra.UAParser.friendly_name(%{browser: "Unknown", browser_version: nil, os: "Unknown"})
    "Unknown browser"

# `parse`
*since 0.1.0* 

```elixir
@spec parse(String.t() | nil) :: parsed()
```

Parses a user-agent string into a structured map.

Returns `%{browser: String.t(), browser_version: String.t() | nil, os: String.t()}`.
Returns `%{browser: "Unknown", browser_version: nil, os: "Unknown"}` for
`nil`, empty, or unrecognized input.

## Examples

    iex> Sigra.UAParser.parse("Mozilla/5.0 ... Chrome/120.0.0.0 Safari/537.36")
    %{browser: "Chrome", browser_version: "120", os: ...}

    iex> Sigra.UAParser.parse(nil)
    %{browser: "Unknown", browser_version: nil, os: "Unknown"}

---

*Consult [api-reference.md](api-reference.md) for complete listing*
