Source code for afwf.script_filter_object
# -*- coding: utf-8 -*-
"""
todo: add docstring
"""
import attrs
from attrs_mate import AttrsClass
[docs]@attrs.define
class ScriptFilterObject(AttrsClass):
"""
[CN]
所有的 ScriptFilter 中出现的 Object 比如 Item, 或是 ScriptFilter 本身都是这个
类的子类.
根据 Alfred 的 `官方文档 <https://www.alfredapp.com/help/workflows/inputs/script-filter/json/>`_
Script Filter 是一个 JSON 的数据结构. 但这个 JSON 数据结构与 Python OOP 的序列化接口
有差别. OOP 序列化接口是为了能从 JSON 中还原 object. 而 Script Filter 接口是为
Alfred 服务的. 例如 OOP 中如果一个 attribute 的值为 None, 那么序列化后还是需要保留
这个值. Script Filter 中如果一个 attribute 被解读为 Omit, 这个 attribute 就彻底
不应该存在, 不然会出现歧义. 所以 ScriptFilterObject 是一种特殊的对象, 同时提供了
OOP 序列化接口 和 Script Filter 序列化接口.
"""
[docs] def to_script_filter(self) -> dict:
"""
Convert object to Alfred Workflow Script Filter friendly dictionary.
"""
dct = dict()
for k, v in attrs.asdict(self, recurse=False).items():
if v:
if isinstance(v, ScriptFilterObject):
v1 = v.to_script_filter()
if v1:
dct[k] = v1
elif isinstance(v, list):
lst = list()
for i in v:
if isinstance(i, ScriptFilterObject):
lst.append(i.to_script_filter())
else:
lst.append(i)
dct[k] = lst
else:
dct[k] = v
return dct