# Resolvers Module The `resolvers` package provides lazy value computation for TreeStore nodes. ## Module Structure ```{mermaid} graph TB subgraph "genro_treestore.resolvers" BASE[base.py
TreeStoreResolver] CB[callback.py
CallbackResolver] DIR[directory.py
DirectoryResolver] TXT[txtdoc.py
TxtDocResolver] BASE --> CB BASE --> DIR BASE --> TXT end ``` ## TreeStoreResolver ```{eval-rst} .. autoclass:: genro_treestore.TreeStoreResolver :members: :undoc-members: :show-inheritance: ``` ## CallbackResolver ```{eval-rst} .. autoclass:: genro_treestore.CallbackResolver :members: :undoc-members: :show-inheritance: ``` ### Example ```python from genro_treestore import TreeStore, CallbackResolver store = TreeStore() store.set_item('config.base', 'https://api.example.com') store.set_item('config.version', 'v2') def compute_url(node): parent = node.parent return f"{parent['base']}/{parent['version']}" store.set_item('config.full_url') store.set_resolver('config.full_url', CallbackResolver(compute_url)) print(store['config.full_url']) # 'https://api.example.com/v2' ``` ## DirectoryResolver ```{eval-rst} .. autoclass:: genro_treestore.DirectoryResolver :members: :undoc-members: :show-inheritance: ``` ### Example ```python from genro_treestore import TreeStore, DirectoryResolver store = TreeStore() store.set_item('files') store.set_resolver('files', DirectoryResolver('/path/to/dir')) # Directory contents loaded on first access for name in store['files'].keys(): print(name) ``` ## TxtDocResolver ```{eval-rst} .. autoclass:: genro_treestore.TxtDocResolver :members: :undoc-members: :show-inheritance: ``` ### Example ```python from genro_treestore import TreeStore, TxtDocResolver store = TreeStore() store.set_item('readme') store.set_resolver('readme', TxtDocResolver('README.md')) print(store['readme']) # File contents ``` ## Resolver Architecture ```{mermaid} classDiagram class TreeStoreResolver { <> +load(node)* +cache_time: int } class CallbackResolver { +callback: Callable +cache_time: int +load(node) } class DirectoryResolver { +path: Path +load(node) } class TxtDocResolver { +path: Path +load(node) } TreeStoreResolver <|-- CallbackResolver TreeStoreResolver <|-- DirectoryResolver TreeStoreResolver <|-- TxtDocResolver ``` ## Resolver Lifecycle ```{mermaid} stateDiagram-v2 [*] --> Attached: set_resolver() Attached --> Loading: value accessed Loading --> Cached: load() returns Cached --> Loading: cache expired Cached --> [*]: node deleted ``` ## Caching | Resolver | Default Cache | Configurable | |----------|--------------|--------------| | `CallbackResolver` | None | Yes (`cache_time`) | | `DirectoryResolver` | Permanent | No | | `TxtDocResolver` | Permanent | No | ## Creating Custom Resolvers ```python from genro_treestore import TreeStoreResolver class ApiResolver(TreeStoreResolver): """Fetch value from REST API.""" def __init__(self, endpoint: str, cache_time: int = 60): self.endpoint = endpoint self.cache_time = cache_time def load(self, node): import requests response = requests.get(self.endpoint) return response.json() # Usage store.set_resolver('api.data', ApiResolver('https://api.example.com/data')) ``` ## See Also - [Resolvers Guide](../guide/resolvers.md) - Detailed usage guide