/// <reference path="leaf.ts"/>
namespace Leaf {
    let reg = /{{([a-zA-Z0-9]+)(:[^}]*)?}}/g
    export type StringFunction = (name: string) => string
    export function renderString(str: string, actions: {
        [index: string]: string | StringFunction
    }): string {
        reg.lastIndex = 0
        return str.replace(reg, (match, name: string, content: string) => {
            if (content) {
                content = content.slice(1) || null
            }
            if (typeof actions[name] === "function") {
                let fn: StringFunction = actions[name] as StringFunction
                return fn[name](content)
            } else if (typeof actions[name] === "string" || typeof actions[name] === "number") {
                return actions[name].toString()
            } else {
                return match
            }
        })
    }
    export function render<T>(obj: T, actions: {
        [index: string]: string | StringFunction
    }): T {
        if (typeof obj === "string") {
            return renderString(obj, actions) as any as T
        } else if (obj instanceof String) {
            return renderString(obj.toString(), actions) as any as T
        } else if (!obj) {
            return obj
        } else if (obj instanceof Array) {
            return obj.map((item) => {
                return render(item, actions)
            }) as any as T
        } else if (obj instanceof Date) {
            return obj as any as T
        } else if (typeof obj === "object") {
            let result: any = {}
            for (let key in obj) {
                let value = render(obj[key], actions)
                result[key] = value
            }
            return result as any as T
        }
        return obj
    }
}
