From e5b13a1bb79a4e184333bed85465344d9129ea86 Mon Sep 17 00:00:00 2001 From: uzo2005 Date: Wed, 28 Feb 2024 00:03:29 +0100 Subject: [PATCH] Show Tim + Prologue --- example/example_prologue.nim | 56 ++++++++++++++++++ .../ast/4ea994e1bf2ae5bdb6ac8c35bf15be6c.ast | Bin 0 -> 7583 bytes .../ast/64b1d1f7eac181e9e04e67aedd790266.ast | Bin 0 -> 10757 bytes .../ast/751b198f394a4b773f281f778a7c2696.ast | Bin 0 -> 7980 bytes .../ast/a7820ac8a0e29bfb7ee97db0a0e06e2b.ast | Bin 0 -> 7520 bytes .../ast/d6418f1aa52421165c8f119aaa22fa53.ast | Bin 0 -> 7955 bytes 6 files changed, 56 insertions(+) create mode 100644 example/example_prologue.nim create mode 100644 example/storage/ast/4ea994e1bf2ae5bdb6ac8c35bf15be6c.ast create mode 100644 example/storage/ast/64b1d1f7eac181e9e04e67aedd790266.ast create mode 100644 example/storage/ast/751b198f394a4b773f281f778a7c2696.ast create mode 100644 example/storage/ast/a7820ac8a0e29bfb7ee97db0a0e06e2b.ast create mode 100644 example/storage/ast/d6418f1aa52421165c8f119aaa22fa53.ast diff --git a/example/example_prologue.nim b/example/example_prologue.nim new file mode 100644 index 0000000..9dc7236 --- /dev/null +++ b/example/example_prologue.nim @@ -0,0 +1,56 @@ +#This example demonstrates using Tim with Prologue +import std/[strutils, times] +import prologue +include ./initializer + +#init Settings for prologue +let + settings = newSettings(port = Port(8082)) + +var app = newApp(settings = settings) + +#define your route handling callbacks +proc indexPageHandler(ctx: Context) {.async, gcsafe.} = + let localObjects = %*{ + "meta": { + "title": "Tim Engine is Awesome!" + }, + "path": "/" + } + + {.cast(gcsafe).}: #timl is a global using GC'ed memory and prologue loves it's callbacks to be gc-safe + let indexPage = timl.render(viewName = "index", layoutName = "base", local = localObjects) + + resp indexPage + +proc aboutPageHandler(ctx: Context) {.async, gcsafe.} = + let localObjects = %*{ + "meta": { + "title": "About Tim Engine" + }, + "path": "/about" + } + {.cast(gcsafe).}: #timl is a global using GC'ed memory and prologue loves it's callbacks to be gc-safe + let aboutPage = timl.render(viewName = "about", layoutName = "secondary", local = localObjects) + + resp aboutPage + +proc e404(ctx: Context) {.async, gcsafe.} = + let localObjects = %*{ + "meta": { + "title": "Oh, you're a genius!", + "msg": "Oh yes, yes. It's got action, it's got drama, it's got dance! Oh, it's going to be a hit hit hit!" + }, + "path": %*(ctx.request.path) + } + {.cast(gcsafe).}: #timl is a global using GC'ed memory and prologue loves it's callbacks to be gc-safe + let e404Page = timl.render(viewName = "error", layoutName = "base", local = localObjects) + + resp e404Page + +#tell prologue how to handle routes +app.addRoute("/", indexPageHandler) +app.addRoute("/about", aboutPageHandler) +app.registerErrorHandler(Http404, e404) + +app.run() \ No newline at end of file diff --git a/example/storage/ast/4ea994e1bf2ae5bdb6ac8c35bf15be6c.ast b/example/storage/ast/4ea994e1bf2ae5bdb6ac8c35bf15be6c.ast new file mode 100644 index 0000000000000000000000000000000000000000..a8de2e7abadff5a4070a505e30e477fbb7090354 GIT binary patch literal 7583 zcmbuE>uw}R6~`xB!yOUs*UE0#NE^E6;<3lxB}5ws*@?2S(uRoeCG>RH%rx#B-8Hsn z#RuRELVN%o0C)i;-iasR5mMcAer0d<7#6TrQ!}T|<$o@9>av5u_U}0v2cMKLKZn2w z$47+_XHnBY9DGQqACa*#!M-o~ybwMiqZ7vFEhHG>`1dx^7ng;J(n8n1_zOb#qKv3@ z&i;>vKP>v{^1?THTL>>bvq>WOl&=t7e2HOPW z91GzM84*hpI2?pe3ribrU6|lWS!iEfAcRmx%Hscx_@_jl(U&HOt@W#9gZN{@g2N6! zRrabdxPde>Hg)WT(E65euZ*dhd&6NJU4+Zjtk&~&qiYF87?=65taMRnT{T0K=EK|; zj5ro$rl*Lgyp!hY zhaEUyTP}ox2^j&-s``>g|GfOhy375@Q#1e+PIavX^{(z%=1JOAS+ohJsKEf@RDhGD z6c!i3yv!0`?sGx_FmRmw_l4n|RoW=~uZ`8e{`TiTs0XT9SGrbdu+~P7?ZF8&^ zWv$|}%+y($G%sS5mB0vSoB#yBUDSSp21WvehQ@3%-NXI`Vb5&Y1uLB{SLU7?hliT9 z4v+`pEs=oUWdpb_CJ^%ZRU(jJj^9oQ$SapSSV%7A=tP*Xxhu*#k22gxl6LeNCNKhu z>avgU%fkE>8GB*-hfKV_PP0Tcnbv3DQ^}@?@-$W#dfuc)H!3O;6;+ijib6$dUTghC zs|(u}l>NI}Q7^X)W}TY!T&redcd5%xv??!jy;x^zp(C@dbrZI7ZyL*QR=QVEW)&HA z*0vV4uC``2<=PfmZN<~`)NE+C1GWibK(H8lRmS2a5aeOFC`%LC#+8u>S}<`(g5P(& zkOD<{bf5tRJ;LUig8R~k1Z!`tP{J@c9r(Zd@PeKl`#ES);Lw8V*-TQKuDt10?S4L< zfEVqb6#^Z~iIIdI`yjGplv0Q88cGi_;P7#GkcdRS3HHE?B;L?)q3<|FP)>1{#%Iwy z)4ncTq^{8A@H>Z)Bz>STQN7gt9gpev=UG&o`NFXf5*eQg2BIzxn4BB8J3@k&SU4FR zvob+dr+HLwd=L~BtWFlCt!(Cw5SS#@bTubN4C``TBsvMIG|POOoIAeF1OX@E*ZU|I zS?sUeD6|P&RU*>0=R#;A?$%&Fk-<>KlE4MSk-M{a>FH;YX)c7b4_U-9$KiCf@_H!2O z<>RS3I1l#1!&$T!?#)#9(JqWp5FSk}+rc>A3&+zS+}m%DH`o6T!s#@y>a2?P+w8%< z9aQ(xX;71qnufEPC5_}`OTVtfejgu&M`Ja9JU$F(d*OkFc%UZX^e`G*G>2;Yxy3Y7 zqvL~cGHbcKKWoIg*xIs#h4Qq?{SHawA#BlmYHS2%hw-R&W70;$`gSnx98|LhUWk;n zbQq5J-krF`N^haKI3JNcDwJy%{H!JT>0z$nC1_wIaQS$3AM`OnjFqk=rtXIVHbe^yv6P0B%h9b1r5CpDR_1 zMLo7pHnCQ}Qg5F;dfT3xM#|oRb0zYA2STuscjnm|N$zcT*LEyS5e#&= zV<8}RuNR=?=ISkgJssFoUeBf@V3cq@WfP*yI_`FBw9)qIJ-K#+#yZ&~Xigl4PCT*V zwS7A)3;Vcu^}iVKkTS}axjs@QJP z-7BSK`kg{0OPx;7j^NYDx?3e23sBS>d9*-tPs4w9ixiw_qyG8ZzuU`$eV6Ux-@cJ1 rsga&=x=jrbzA9g^j88rtL>#u*t*BR0NtsZo(6L9t{E(1xM$7*JrY9xp literal 0 HcmV?d00001 diff --git a/example/storage/ast/64b1d1f7eac181e9e04e67aedd790266.ast b/example/storage/ast/64b1d1f7eac181e9e04e67aedd790266.ast new file mode 100644 index 0000000000000000000000000000000000000000..1f10a551f07fc39ee6dd67393a50a16f5f4aced6 GIT binary patch literal 10757 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 KkdSgl;r}mZd2Dq6 literal 0 HcmV?d00001 diff --git a/example/storage/ast/751b198f394a4b773f281f778a7c2696.ast b/example/storage/ast/751b198f394a4b773f281f778a7c2696.ast new file mode 100644 index 0000000000000000000000000000000000000000..29dbacac347df2e3d56d361612bcf504ad0ea5b8 GIT binary patch literal 7980 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