How to define a function that returns an object of unknown shape?

Is it possible to define a function that returns an object of unknown shape, so that it would allow returning something like

 let basic = {
      example = 0.0;
      another = 2.2;
      third = {
        a = {
          b = 2;
          c = 3;};
        b = 2;}
    };

but also something like

let just_one = {
     onething = "true";
};

What’s the syntax for that?:
public func returnObjectOfUnknownShape(arg1: Text) : [what goes here?] {

Or should I be using some other type for this kind of structured data? Which one?

1 Like

You can use a variant:

type MyVariant = {
  #basic : {
    example : Float;
    another : Float;
    third : {
      a : {
        b : Nat;
        c : Nat;
      };
      b : Nat;
    };
  };
  #onething : Text;
};
func returnObjectOfUnknownShape(arg1: Text) : MyVariant {
  if (arg1 == "") {
    #basic {
      example = 0.0;
      another = 2.2;
      third = {
        a = {
          b = 2;
          c = 3;
        };
        b = 2;
      }
    }
  } else {
    #onething "true"
  }
};

My talk from Motoko Bootcamp might help gain an intuition for them:

1 Like

For it to be truly unknown you’d need to use a type argument, but that means the only useful thing you can do with the value is return it:

func returnObjectOfUnknownShape<T>(arg1: T) : T {
  arg1
};

This is more commonly known as the “identity” function:

func id<A>(x: A) : A = x;
let basic = {
  example = 0.0;
  another = 2.2;
  third = {
    a = {
      b = 2;
      c = 3;
    };
    b = 2;}
};

let just_one = {
  onething = "true";
};
let _ = id(basic);
let _ = id(just_one);
2 Likes

Thank you. I did see this at the time and forgot to reply.

I was trying to make it return an object of unknown shape, having done some processing on it, which appears to be impossible in Motoko. It’s ok.

You can do this:

func returnObjectOfUnknownShape(arg1: Text) : {} {
  if (arg1 == "") {
    {
      basic = {
        example = 0.0;
        another = 2.2;
        third = {
          a = {
            b = 2;
            c = 3;
          };
          b = 2;
        };
      };
    };
  } else {
    {
      just_one = "true";
    }
  }
};

See GitHub - icdevs/candy_library: Library for Converting Types and Creating Workable Motoko Collections