Reference / dowork

dowork

# do_work is a helper function that calls a function to execute a task or deployment
def do_work(
    f,
    fArgs,
    inputs=None,
):
    if len(fArgs) == 1 and fArgs[0] == "ctx":
        return _do_work_ctx(f, inputs)

    return _do_work(f, fArgs, inputs)

def check_params(
    fn,
    fArgs,
    fKWArgs,
    inputs=[],
):
    if len(fArgs) == 1 and fArgs[0] == "ctx":
        return

    fDef = render_function(fn)["function"]
    fName = fDef["name"]
    fPos = fDef["pos"]

    # check that every input is represented in fArgs or fKWArgs
    for k in inputs:
        if k not in fArgs and k not in fKWArgs:
            fail("Input '" + k + "' is not in function parameters for '" + str(fName) + "' at " + str(fPos))

    # check that every fArg is represented in inputs
    for k in fArgs:
        if k not in inputs:
            fail("Function parameter '" + k + "' is not present in inputs and has no default value for '" + str(fName) + "' at " + str(fPos) + "inputs=" + str(inputs))
    

def _do_work(
    f,
    fArgs,
    inputs=None,
):
    args = {}
    if inputs:
        args = map_from_json(json.decode(inputs))
    return json.encode(f(**args))

def _do_work_ctx(
    f,
    inputs=None,
):
    args = {}
    if inputs:
        args["inputs"] = vars_from_json(json.decode(inputs))

    ctx = struct(**args)
    return json.encode(f(ctx))

def vars_from_json(json):
    vars = {}
    for k, v in json.items():
        # TODO: handle known types using a "$type" field
        # Example below
        if type(v) == "dict" and "$type" in v:
            if v["$type"] == "ref":
                vars[k] = v["ref"]

        vars[k] = v

    return struct(**vars)

def map_from_json(json):
    vars = {}
    for k, v in json.items():
        # TODO: handle known types using a "$type" field
        # Example below
        if type(v) == "dict" and "$type" in v:
            if v["$type"] == "ref":
                vars[k] = v["ref"]

        vars[k] = v

    return vars