import json


def from_str(x):
    assert isinstance(x, str)
    return x


def from_none(x):
    assert x is None
    return x


def from_union(fs, x):
    for f in fs:
        try:
            return f(x)
        except:
            pass
    assert False


def to_class(c, x):
    assert isinstance(x, c)
    return x.to_dict()


class SdfGeometryModel:
    def __init__(
        self,
        name,
        ixx,
        ixy,
        ixz,
        iyy,
        izz,
        mass,
        posX,
        posY,
        posZ,
        eulerX,
        eulerY,
        eulerZ,
        iyz,
        meshPath,
        friction,
        centerMassX,
        centerMassY,
        centerMassZ,
    ):
        self.name = name
        self.ixx = ixx
        self.ixy = ixy
        self.ixz = ixz
        self.iyy = iyy
        self.izz = izz
        self.mass = mass
        self.posX = posX
        self.posY = posY
        self.posZ = posZ
        self.eulerX = eulerX
        self.eulerY = eulerY
        self.eulerZ = eulerZ
        self.iyz = iyz
        self.meshPath = meshPath
        self.friction = friction
        self.centerMassX = centerMassX
        self.centerMassY = centerMassY
        self.centerMassZ = centerMassZ

    @staticmethod
    def from_dict(obj):
        assert isinstance(obj, dict)
        name = from_union([from_str, from_none], obj.get("name"))
        ixx = from_union([from_str, from_none], obj.get("ixx"))
        ixy = from_union([from_str, from_none], obj.get("ixy"))
        ixz = from_union([from_str, from_none], obj.get("ixz"))
        iyy = from_union([from_str, from_none], obj.get("iyy"))
        iyz = from_union([from_str, from_none], obj.get("iyz"))
        izz = from_union([from_str, from_none], obj.get("izz"))
        mass = from_union([from_str, from_none], obj.get("mass"))
        posX = from_union([from_str, from_none], obj.get("posX"))
        posY = from_union([from_str, from_none], obj.get("posY"))
        posZ = from_union([from_str, from_none], obj.get("posZ"))
        eulerX = from_union([from_str, from_none], obj.get("eulerX"))
        eulerY = from_union([from_str, from_none], obj.get("eulerY"))
        eulerZ = from_union([from_str, from_none], obj.get("eulerZ"))
        meshPath = from_union([from_str, from_none], obj.get("meshPath"))
        friction = from_union([from_str, from_none], obj.get("friction"))
        centerMassX = from_union([from_str, from_none], obj.get("centerMassX"))
        centerMassY = from_union([from_str, from_none], obj.get("centerMassY"))
        centerMassZ = from_union([from_str, from_none], obj.get("centerMassZ"))
        return SdfGeometryModel(
            name,
            ixx,
            ixy,
            ixz,
            iyy,
            izz,
            mass,
            posX,
            posY,
            posZ,
            eulerX,
            eulerY,
            eulerZ,
            iyz,
            meshPath,
            friction,
            centerMassX,
            centerMassY,
            centerMassZ,
        )

    def to_dict(self):
        result = {}
        if self.name is not None:
            result["name"] = from_union([from_str, from_none], self.name)
        if self.ixx is not None:
            result["ixx"] = from_union([from_str, from_none], self.ixx)
        if self.ixy is not None:
            result["ixy"] = from_union([from_str, from_none], self.ixy)
        if self.ixz is not None:
            result["ixz"] = from_union([from_str, from_none], self.ixz)
        if self.iyy is not None:
            result["iyy"] = from_union([from_str, from_none], self.iyy)
        if self.izz is not None:
            result["izz"] = from_union([from_str, from_none], self.izz)
        if self.mass is not None:
            result["mass"] = from_union([from_str, from_none], self.mass)
        if self.posX is not None:
            result["posX"] = from_union([from_str, from_none], self.posX)
        if self.posY is not None:
            result["posY"] = from_union([from_str, from_none], self.posY)
        if self.posZ is not None:
            result["posZ"] = from_union([from_str, from_none], self.posZ)
        if self.eulerX is not None:
            result["eulerX"] = from_union([from_str, from_none], self.eulerX)
        if self.eulerY is not None:
            result["eulerY"] = from_union([from_str, from_none], self.eulerY)
        if self.eulerZ is not None:
            result["eulerZ"] = from_union([from_str, from_none], self.eulerZ)
        if self.iyz is not None:
            result["iyz"] = from_union([from_str, from_none], self.iyz)
        if self.meshPath is not None:
            result["meshPath"] = from_union([from_str, from_none], self.meshPath)
        if self.friction is not None:
            result["friction"] = from_union([from_str, from_none], self.eulerZ)
        if self.centerMassX is not None:
            result["centerMassX"] = from_union([from_str, from_none], self.centerMassX)
        if self.centerMassY is not None:
            result["centerMassY"] = from_union([from_str, from_none], self.centerMassY)
        if self.centerMassZ is not None:
            result["centerMassZ"] = from_union([from_str, from_none], self.centerMassZ)
        return result

    def toJSON(self) -> str:
        return str(self.to_dict()).replace("'", '"')
