C# create domain class/interface

Date: 2019-11-13

Code

window.addEventListener("DOMContentLoaded", () => {
    const publicProps = /\bpublic\b.*?\s+?([_a-zA-Z0-9<>\[\]\?]+)\s+([_a-zA-Z0-9]+?)\s*[;{=]/gm;
    const fallbackProps = /\b([_a-zA-Z0-9<>\[\]\?]+)\s+([_a-zA-Z0-9]+?)\s*[;{=]/gm;
    const reClass = /\b(class|interface|struct)\s*?([^\s]+)/gi;
    let className = "Unknown";

    const tab = "\t";
    const line = "\r\n";

    const getMatches = (re, str) => {
        let match, matches = [];
        while (match = re.exec(str)) {
            matches.push(match);
        }
        return matches;
    };

    const filterProps = (prop) => {
        console.log(prop.name, prop.type);
        const reserved = ["void", "return", "class", "struct", "enum", "using" ];
        if (reserved.indexOf(prop.type) === -1) {
            return true;
        }
    };

    const convertPublicProperty = (prop, prefix) => {
        let p = prop.name;
        let c = prop.last ? "" : ",";
        return `public ${prop.type} ${p} { get; set; }`; // ${prop.type}
    };

    const convertProperty = (prop, prefix) => {
        let p = prop.name;
        let c = prop.last ? "" : ",";
        return `${prop.type} ${p} { get; set; }`; // ${prop.type}
    };

    const mapTabs = (arr, tabCount) => {
        const tabs = tab.repeat(tabCount);
        return Array.from(arr).map(a => tabs + a);
    }
    const mapProps = (match, i, arr) => {
        return { type: match[1], name: match[2], last: arr.length - 1 === i };
    };

    const convertAll = (str) => {
        let props = getMatches(publicProps, str).map(mapProps).filter(filterProps);
        if (props.length < 1) {
            props = getMatches(fallbackProps, str).map(mapProps).filter(filterProps);
        }

        const props1 = mapTabs(props.map(convertPublicProperty), 1);
        const props2 = mapTabs(props.map(convertProperty), 1);

        const mapToClass = mapTabs([
            `public class ${className}`,
            `{`,
            ...props1,
            `}`
        ], 1);
        const mapToInterface = mapTabs([
            `public interface ${className}`,
            `{`,
            ...props2,
            `}`
        ], 1);
        const fullMapper = [
            `namespace Extensions`,
            `{`,
            ...mapToInterface,
            ...mapToClass,
            `}`
        ];

        return fullMapper.join(line);
    };

    const run = () => {
        const input = document.querySelector("#input").value;
        className = (reClass.exec(input) || [])[2] || null;
        if (className) {
            console.log(input);
            const output = convertAll(input);
            document.querySelector("#output").value = output;
        }
    };
    document.querySelector("#btnRun").addEventListener("click", run);
});
28690cookie-checkC# create domain class/interface