sourceafBedNap::AppModule.fan

using afIoc
using afIocConfig
using afBedSheet
using afEfanXtra
using afSlim

** The [afIoc]`http://repo.status302.com/doc/afIoc/#overview` module class.
const class AppModule {

    static Void bind(ServiceBinder binder) {
        binder.bind(IdGenerator#)
        binder.bind(VisitorBookService#)

        binder.bind(SampleData#)
    }
 
    @Contribute { serviceType=Routes# }
    static Void contributeRoutes(OrderedConfig config) {
        config.add(Route(`/src/***`, SourceCodePage#service))
    }
 
    @Contribute { serviceType=ValueEncoders# }
    static Void contributeValueEncoders(MappedConfig config) {
        config[Visitor#] = config.autobuild(VisitorValueEncoder#)
    }
 
    @Contribute { serviceType=RegistryStartup# }
    static Void contributeRegistryStartup(OrderedConfig config, SampleData sampleData) {
        config.add |->| { sampleData.createSampleData() }
    }



    // ---- Serve Up Files from `etc/web/` --------------------------------------------------------
    
    @Contribute { serviceType=FileHandler# }
    static Void contributeFileHandler(MappedConfig config) {
        config[`/`] = `etc/web/`
    }

    
    
    // ---- Add efan Template Directories ---------------------------------------------------------
    
    @Contribute { serviceType=EfanTemplateDirectories# }
    static Void contributeEfanDirs(OrderedConfig config) {
        addRecursive(config, `etc/pages/`.toFile)
        addRecursive(config, `etc/components/`.toFile)
    }
    
    static Void addRecursive(OrderedConfig config, File dir) {
        if (!dir.isDir)
            throw Err("`${dir.normalize}` is not a directory")
        dir.walk { if (it.isDir) config.add(it) }
    }
    
    
    
    // ---- Use Slim Templates --------------------------------------------------------------------
    
    @Build { serviceId="slim" }
    static Slim buildSlim() {
        Slim(TagStyle.xhtml)
    }

    @Contribute { serviceType=EfanTemplateConverters# }
    internal static Void contributeEfanTemplateConverters(MappedConfig config, Slim slim) {
        config["slim"] = |File file -> Str| { slim.parseFromFile(file) }
    }
}