Clojure EDN作为代码生成元数据源

时间:2014-04-28 16:51:59

标签: templates clojure code-generation edn

Clojure的新手,并想知道如何使用它来制作我编程的其他语言更容易。

我希望能够做的一件事是使用Clojure进行代码生成。

例如,给定数据文件(EDN格式)的输入,我应该如何(1)走这个结构,或者(2)将数据推送到现有的模板机制?

下面的数据将用于定义简单的REST API,以便您可以从中生成客户端。使用不同的模板生成多种语言的客户端。

(:restcall "GetAccountBalance" 
  {:method "GET" :path "account/balance"}
  {:id int})

(:restcall "GetLastTransactions" 
  {:method "GET" :path "account/transactions"}
  {:page int})

结果代码将类似于

public void GetAccountBalance(int id) 
{
    var input = new { id = id };
    callIntoRestLibrary("GET", "account/balance", input);
}

public void GetLastTransactions(int page) 
{
    var input = new { page = page };
    callIntoRestLibrary("GET", "account/transactions", input);
}

注意:我的最终目标是将这些作为System.Net.Http.HttpClient通过C#调用,但也可以将这些调用转换为JavaScript / Ajax调用

1 个答案:

答案 0 :(得分:3)

使用Clojure进行模板设置有多种选择。一个值得关注的地方是Clojure Toolbox

以下是clostache的示例,mustache的一个小型库(358 loc)实现。

(ns so.core
  (:require [clostache.parser :refer (render)]))

(def template "
public void {{restcall}}({{id}} id) 
{
    var input = new { id = id };
    callIntoRestLibrary(\"{{method}}\", \"{{path}}\", input);
}")

(def data 
  {:restcall "GetAccountBalance" 
   :method "GET" :path "account/balance" :id "int"})


(print (render template data))

输出:

public void GetAccountBalance(int id)
{
    var input = new { id = id };
    callIntoRestLibrary("GET", "account/balance", input);
}

澄清对read EDN的含义的混淆。

(spit "foo.txt" (prn-str data))

现在,文件foo.txt包含data的文字表示,可能是您的起点。

(def data2 (with-open [r (java.io.PushbackReader. (java.io.FileReader. "foo.txt"))] 
             (clojure.edn/read r)))

(= data data2) ;=> true

因此,read不只是提取文本,还会将其解析为数据表示。

相关问题