def ifNotNullElse(state, scope, nameExpr, nameType, thenClause, elseClause): if all(x is not None for x in nameExpr.values()): thenScope = DynamicScope(scope) thenScope.let(untagUnions(nameExpr, nameType)) return thenClause(state, thenScope) else: return elseClause(state, scope)
def cast(state, scope, expr, fromType, cases, partial, parser): fromType = parser.getAvroType(fromType) for name, toType, clause in cases: toType = parser.getAvroType(toType) if isinstance(fromType, titus.datatype.AvroUnion) and isinstance(expr, dict) and len(expr) == 1: tag, = expr.keys() value, = expr.values() if not ((tag == toType.name) or \ (tag == "int" and toType.name in ("long", "float", "double")) or \ (tag == "long" and toType.name in ("float", "double")) or \ (tag == "float" and toType.name == "double")): continue else: value = expr try: castValue = titus.datatype.jsonDecoder(toType, value) except (AvroException, TypeError): pass else: clauseScope = DynamicScope(scope) clauseScope.let({name: castValue}) out = clause(state, clauseScope) if partial: return None else: return out return None
def update(state, scope, obj, path, to): if len(path) > 0: head, tail = path[0], path[1:] if isinstance(obj, dict): out = {} for k, v in obj.items(): if k == head: out[k] = update(state, scope, v, tail, to) else: out[k] = v return out elif isinstance(obj, (list, tuple)): out = [] for i, x in enumerate(obj): if i == head: out.append(update(state, scope, x, tail, to)) else: out.append(x) return out else: raise Exception elif callable(to): callScope = DynamicScope(scope) callScope.let({to.paramNames[0]: obj}) return to(state, callScope) else: return to
def doForkeyval(state, scope, forkey, forval, mapping, loopBody): loopScope = DynamicScope(scope) bodyScope = DynamicScope(loopScope) for key, val in mapping.items(): state.checkTime() loopScope.let({forkey: key, forval: val}) loopBody(state, bodyScope) return None
def doForeach(state, scope, name, array, loopBody): loopScope = DynamicScope(scope) bodyScope = DynamicScope(loopScope) for item in array: state.checkTime() loopScope.let({name: item}) loopBody(state, bodyScope) return None