code4game/libgltf

View on GitHub
tools/jsonschematoc11/c11types/c11variable.py

Summary

Maintainability
C
7 hrs
Test Coverage
from .c11typebool import C11TypeBool
from .c11typeinteger import C11TypeInteger
from .c11typenumber import C11TypeNumber
from .c11typestring import C11TypeString
from .c11typearray import C11TypeArray
from .c11typemap import C11TypeMap
from .c11typenone import C11TypeNone

class C11Variable(object):

    """variable."""

    def __init__(self, name, schemaValue):
        """Construct and declare some vars."""
        self.schemaValue = schemaValue
        self.typeName = ""
        self.c11Type = C11TypeNone()
        self.name = name
        self.comment = None
        if u'description' in schemaValue:
            self.comment = schemaValue[u'description']

    def revise(self, c11Types):
        variableSchemaValue = self.schemaValue
        if u'$ref' in self.schemaValue:
            schemaValueType = self.schemaValue[u'$ref']
        elif u'type' in self.schemaValue:
            schemaValueType = self.schemaValue[u'type']
            if schemaValueType == u'object' and u'additionalProperties' in self.schemaValue:
                schemaValueType = u'map'
                variableSchemaValue = self.schemaValue[u'additionalProperties']
        elif u'allOf' in self.schemaValue and len(self.schemaValue[u'allOf']) > 0 and u'$ref' in self.schemaValue[u'allOf'][0]:
            schemaValueType = self.schemaValue[u'allOf'][0][u'$ref']
            #schemaValueType = u'array'
            #variableSchemaValue = self.schemaValue[u'allOf'][0]
        elif u'anyOf' in self.schemaValue and len(self.schemaValue[u'anyOf']) > 0:
            for schemaValueAnyOf in self.schemaValue[u'anyOf']:
                if u'type' not in schemaValueAnyOf:
                    continue
                schemaValueType = schemaValueAnyOf[u'type']
                break
        else:
            return (0, None)

        if schemaValueType == u'bool' or schemaValueType == u'boolean':
            self.c11Type = C11TypeBool()
            self.typeName = u'bool'
        elif schemaValueType == u'integer':
            self.c11Type = C11TypeInteger()
            self.typeName = u'integer'
        elif schemaValueType == u'number':
            self.c11Type = C11TypeNumber()
            self.typeName = u'number'
        elif schemaValueType == u'string':
            self.c11Type = C11TypeString()
            self.typeName = u'string'
        elif schemaValueType == u'array':
            self.c11Type = C11TypeArray()
            self.typeName = u'array'
            self.c11Type.setItemSchema(variableSchemaValue)
        elif schemaValueType == u'map':
            self.c11Type = C11TypeMap()
            self.typeName = u'map'
            self.c11Type.setItemSchema(variableSchemaValue)
        else:
            if schemaValueType not in c11Types:
                if u'additionalProperties' in self.schemaValue:
                    schemaValueAdditionalProperties = self.schemaValue[u'additionalProperties']
                    if u'$ref' in schemaValueAdditionalProperties:
                        schemaValueType = schemaValueAdditionalProperties[u'$ref']
            if schemaValueType in c11Types:
                self.c11Type = c11Types[schemaValueType]
                self.typeName = u'struct'
            else:
                self.c11Type = C11TypeNone()
        self.c11Type.revise(c11Types)
        return (0, None)

    def hasComment(self):
        return self.comment != None

    def codeComment(self):
        return self.comment

    def codeDeclare(self):
        return u'%s %s' % (self.c11Type.codeTypeName(withDeclare=True, asVariable=True), self.name)

    def codeConstructorDefault(self):
        schemaDefaultValue = None
        if u'default' in self.schemaValue:
            schemaDefaultValue = self.schemaValue[u'default']
        return u'%s(%s)' % (self.name, self.c11Type.codeDefaultValue(schemaDefaultValue))

    def codeParser(self, isSet=True):
        codeLines = []
        codeCheckLine = self.c11Type.codeJsonCheck()
        if isSet:
            if codeCheckLine is None or len(codeCheckLine) <= 0:
                codeLines.append(u'if (_JsonValue.HasMember("%s"))' % self.name)
            else:
                codeLines.append(u'if (_JsonValue.HasMember("%s") && _JsonValue["%s"].%s)' % (self.name, self.name, codeCheckLine))
        else:
            if self.typeName == u'array' or self.typeName == u'map':
                codeLines.append(u'if (!_rData.data.%s.empty())' % self.name)
            elif self.typeName == u'struct':
                codeLines.append(u'if (!!_rData.data.%s)' % self.name)
        codeLines.append(u'{')
        if isSet:
            codeSetLine = self.c11Type.codeJsonSet(u'_rData', self.name)
            if codeSetLine != None and len(codeSetLine) > 0:
                codeLines.append(u'    %s' % (codeSetLine))
        else:
            codeLines.append(u'    JSONCharValue json_value;')
            if self.typeName == u'struct':
                codeLines.append(u'    if (!(%s(*_rData.data.%s, _rData.doc) >> json_value)) return false;' % (self.c11Type.codeTypeName(withDocument=True), self.name))
            else:
                codeLines.append(u'    if (!(TDataDoc<%s>(_rData.data.%s, _rData.doc) >> json_value)) return false;' % (self.c11Type.codeTypeName(asVariable=True), self.name))
            codeLines.append(u'    _JsonValue.AddMember("%s", json_value, _rData.doc->GetAllocator());' % self.name)
        codeLines.append(u'}')
        return codeLines