Skip to content
Snippets Groups Projects
set.ts 1.53 KiB
Newer Older
  • Learn to ignore specific revisions
  • import { DecodeFn, EncodeFn } from "../types";
    import * as util from "./util";
    
    const decode: DecodeFn = (_msg) => {
      return [null];
    };
    
    const isObject = (v) =>
      typeof v === "object" && v.required !== undefined && v.value !== undefined;
    
    const encode: EncodeFn = ({ value, path: initialPath }) => {
      const isObj = typeof value === "object";
    
      const allowPartial = isObj && value.allowPartial !== undefined ? value.allowPartial : false;
    
      const attr = initialPath.split(".").pop() || "";
      const pairs = isObj
        ? Object.entries(value as any[]).map(([k, v]) =>
            isObject(v)
              ? [k, v.value.toString(), v.required]
              : [k, v.toString(), false]
          )
        : [[attr, value]];
    
      const path = initialPath.endsWith(".") ? initialPath : initialPath.slice(0, initialPath.lastIndexOf('.') + 1);
    
    
      return {
        lookup: "Msg",
        header: {
          lookup: "Header",
          msgId: util.uniq("SET@"),
          msgType: "SET",
        },
        body: {
          lookup: "Body",
          request: {
            lookup: "Request",
            set: {
              allowPartial,
              updateObjs: [
                {
                  lookup: "Set.UpdateObject",
                  objPath: path,
                  paramSettings: pairs
                    .filter(([k]) => k !== "allowPartial")
                    .map(([param, value, required]) => ({
                      lookup: "Set.UpdateParamSetting",
                      param,
                      value,
                      required,
                    })),
                },
              ],
            },
          },
        },
      };
    };
    
    export default {
      decode,
      encode
    };