Home Assistant Unofficial Reference 2024.12.1
input.py
Go to the documentation of this file.
1 """Deal with YAML input."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from .objects import Input
8 
9 
10 class UndefinedSubstitution(Exception):
11  """Error raised when we find a substitution that is not defined."""
12 
13  def __init__(self, input_name: str) -> None:
14  """Initialize the undefined substitution exception."""
15  super().__init__(f"No substitution found for input {input_name}")
16  self.inputinput = input
17 
18 
19 def extract_inputs(obj: Any) -> set[str]:
20  """Extract input from a structure."""
21  found: set[str] = set()
22  _extract_inputs(obj, found)
23  return found
24 
25 
26 def _extract_inputs(obj: Any, found: set[str]) -> None:
27  """Extract input from a structure."""
28  if isinstance(obj, Input):
29  found.add(obj.name)
30  return
31 
32  if isinstance(obj, list):
33  for val in obj:
34  _extract_inputs(val, found)
35  return
36 
37  if isinstance(obj, dict):
38  for val in obj.values():
39  _extract_inputs(val, found)
40  return
41 
42 
43 def substitute(obj: Any, substitutions: dict[str, Any]) -> Any:
44  """Substitute values."""
45  if isinstance(obj, Input):
46  if obj.name not in substitutions:
47  raise UndefinedSubstitution(obj.name)
48  return substitutions[obj.name]
49 
50  if isinstance(obj, list):
51  return [substitute(val, substitutions) for val in obj]
52 
53  if isinstance(obj, dict):
54  return {key: substitute(val, substitutions) for key, val in obj.items()}
55 
56  return obj
Any substitute(Any obj, dict[str, Any] substitutions)
Definition: input.py:43
None _extract_inputs(Any obj, set[str] found)
Definition: input.py:26
set[str] extract_inputs(Any obj)
Definition: input.py:19