Skip to content

Commit 06e7357

Browse files
committed
feat(list): add List class for rendering items
1 parent 94c2fbc commit 06e7357

1 file changed

Lines changed: 40 additions & 0 deletions

File tree

textcompose/container/list.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from typing import Any, Optional, Iterable, Union, Callable
2+
3+
from magic_filter import MagicFilter
4+
5+
from textcompose.container.container import BaseContainer
6+
from textcompose.content.content import Value, Condition
7+
8+
9+
class List(BaseContainer):
10+
def __init__(
11+
self,
12+
*items: Value,
13+
getter: Union[MagicFilter, Callable[[dict[str, Any]], Iterable]],
14+
sep: Optional[str] = "\n\n",
15+
inner_sep: str = "\n",
16+
when: Condition | None = None,
17+
) -> None:
18+
super().__init__(*items, when=when)
19+
self.items = items
20+
self.getter = getter
21+
self.sep = sep
22+
self.inner_sep = inner_sep
23+
24+
def _render_item(self, item_value: Any, context: dict[str, Any], **kwargs) -> str | None:
25+
rendered_parts = [
26+
self.resolve_value(item_tpl, {"item": item_value, "context": context}, **kwargs) for item_tpl in self.items
27+
]
28+
return self.inner_sep.join(filter(None, rendered_parts)) or None
29+
30+
def render(self, context: dict[str, Any], **kwargs) -> str | None:
31+
if not self._check_when(context, **kwargs):
32+
return None
33+
34+
items_iterable = self.resolve_value(self.getter, context, **kwargs)
35+
if not items_iterable:
36+
return None
37+
38+
rendered_items = [self._render_item(item_value, context, **kwargs) for item_value in items_iterable]
39+
40+
return self.sep.join(filter(None, rendered_items)) or None

0 commit comments

Comments
 (0)