public string Stringify(GenericDesc contractDesc)
        {
            return
                ($@"{_jsDoc.Format(contractDesc)}{Export}interface I{_options.ContractNameTempate(contractDesc)}<{GenericargsStringify(contractDesc.Arguments)}> {{
{string.Join(Environment.NewLine + Environment.NewLine, contractDesc.Fields.Select((field) => Utils.Ident(_fieldStringify.Stringify(field), _options.IdentSize)))}
}}");
        }
        public string WrapAll(string str, ContractGroup group)
        {
            // calculate all base classes and write union types to end of namespace
            var bases = string.Join(
                Environment.NewLine + Environment.NewLine,
                group.Groups.Values.ToArray()
                .SelectMany(_ => _)
                .Where(_ => (_ is ContractDesc cd) && cd.Base != null && !string.IsNullOrWhiteSpace(cd.Base.Name))
                .GroupBy(_ => (_ as ContractDesc).Base.Name)
                .Select(_ => $@"export type I{_options.ContractNameTempate(new ContractDesc {Name = _.Key})} =
{string.Join(Environment.NewLine, _.ToArray().Select(nestType => Utils.Ident($"| I{_options.ContractNameTempate(nestType)}", _options.IdentSize)))}"));

            return($@"
{NamespaceOrModule} {{
{Utils.Ident(str, _options.IdentSize)}

{Utils.Ident(bases, _options.IdentSize)}
}} 
");
        }
        public string Stringify(ContractEnumDesc contractDesc)
        {
            return
                ($@"{_jsDoc.Format(contractDesc)}{Export}type I{_options.ContractNameTempate(contractDesc)} =
{string.Join(Environment.NewLine, contractDesc.Values.Select(field => Utils.Ident(_enumFieldStringify.Stringify(field), _options.IdentSize)))}");
        }