using System; using System.Collections.Generic; using ln.http.resources; using ln.http; using ln.templates; namespace ln.http.resources { public class TemplateResource : Resource { public Template Template { get; } public object This { get; set; } public override bool HandlesDispatching => true; public TemplateResource(Resource container, string filename) : base(container, System.IO.Path.GetFileName(filename)) { Template = new Template(filename, (container as TemplateProvider)); } public TemplateResource(Resource container, string filename,object This) :this(container,filename) { this.This = This; } public override IEnumerable GetResources() { return new Resource[0]; } public override bool Contains(string name) { return false; } public override void AddResource(Resource resource) { throw new NotImplementedException(); } public override void RemoveResource(Resource resource) { throw new NotImplementedException(); } public override HttpResponse GetResponse(HttpRequest httpRequest, Queue pathStack) => GetResponse(httpRequest, pathStack.ToArray()); public override HttpResponse GetResponse(HttpRequest httpRequest) => GetResponse(httpRequest,new string[0]); public HttpResponse GetResponse(HttpRequest httpRequest,string[] suffixPath) { HttpResponse httpResponse = new HttpResponse(httpRequest); Template.Context context = new Template.Context(Template); context.ExpressionContext.AddMappedValue("__root__", Root); context.ExpressionContext.AddMappedValue("__path__", suffixPath); context.ExpressionContext.AddMappedValue("request", httpRequest); context.ExpressionContext.AddMappedValue("response", httpResponse); context.ExpressionContext.AddMappedValue("this", This); bool unframed = httpRequest.GetRequestHeader("x-template-unframed", "framed").Equals("unframed"); httpResponse.ContentWriter.Write(Template.Generate(context,unframed)); return httpResponse; } } }