|
- from typing import Tuple, Dict, Any, Set, Iterable, List
- from .normalize import normalize_mac, is_mac
-
- DEFAULT_MAC_FIELDS: tuple[str, ...] = (
- "mac",
- "beacon_mac",
- "beaconMac",
- "device_mac",
- "deviceMac",
- "tag_mac",
- "tagMac",
- )
-
- def _first_present(item: dict, keys: Iterable[str]) -> str:
- for k in keys:
- if k in item and item.get(k):
- return str(item.get(k))
- return ""
-
- def extract_beacon_macs(data: object, mac_fields: tuple[str, ...] = DEFAULT_MAC_FIELDS
- ) -> Tuple[Set[str], Dict[str, Any], List[str]]:
- allowed: Set[str] = set()
- by_mac: Dict[str, Any] = {}
- invalid: List[str] = []
-
- items = None
- if isinstance(data, list):
- items = data
- elif isinstance(data, dict):
- for key in ("items", "beacons", "trackers", "data", "result"):
- v = data.get(key)
- if isinstance(v, list):
- items = v
- break
-
- if not items:
- return allowed, by_mac, invalid
-
- for item in items:
- if not isinstance(item, dict):
- continue
- raw = _first_present(item, mac_fields)
- mac = normalize_mac(raw)
- if mac and is_mac(mac):
- allowed.add(mac)
- by_mac[mac] = item
- else:
- if raw:
- invalid.append(str(raw))
-
- return allowed, by_mac, invalid
|