Go Dilinde Mustache Template Sistemi Kullanımı

Go programlama dili Text ve HTML çıktıları üretmek için standart olarak text/template ve html/template paketlerini sağlamakta1. Template konusunu ilerlettikçe bu paketlerden de bahsedeceğim.

AA

Şimdilik önceliğim Mustache template engine bağlamındaki yazıları tamamlamak. Go dilinde {{Mustache}} kullanımı bu anlamda serinin da son yazısı. Hemen vakit kaybetmeden konu başlığımızı atalım.

Go Dilinde Mustache Template Engine Kullanımı

Öncelikle, Go Mustache paketi bir fork olarak cbroglie/mustache üzerinden devam etmekte2 3. Dolayısıyla go get işleminde kaynak olarak güncel fork’u kullanmak gerekmekte. Go dili uyarlamasında ayrıca CLI aracılığıyla da template işlemleri yapmak mümkün. İlk olarak bu kullanıma bakalım.

mustache [data] template [flags]

Hızlıca bir örnek işlem gerçekleştirelim. Aşağıdaki içeriğe sahip bir template içeriğimiz olsun ve bu içeriği doğrudan YAML dosyamız olsun.

invoice: 34843
date   : 2001-01-23
bill-to:
    given  : Chris
    family : Dumars
    address:
        lines: |
            458 Walkman Dr.
            Suite #292
        city    : Royal Oak
        state   : MI
        postal  : 48046
product:
    - sku         : BL394D
      quantity    : 4
      description : Basketball
      price       : 450.00
    - sku         : BL4438H
      quantity    : 1
      description : Super Hoop
      price       : 2392.00
tax  : 251.42
total: 4443.52

Yukarıdaki içerik YAML > Start örneğinin sadeleştirilmiş hali. Bu dosyamızı data.yml olarak isimlendirelim. Şimdi bir de bir şablona ihtiyacımız olacak.

invoice: {{invoice}}
date   : {{date}}
bill-to:
    given  : {{bill-to.given}}
    family : {{bill-to.family}}
    address:
        city    : {{bill-to.address.city}}
        state   : {{bill-to.address.state}}
        postal  : {{bill-to.address.postal}}
product:
{{#product}}
    - sku         : {{sku}}
      quantity    : {{quantity}}
      description : {{description}}
      price       : {{price}}
{{/product}}
tax  : {{tax}}
total: {{total}}

Şablonumuzun adını da template.mustache olsun. Komut satırı arayüzüne mustache üzerinden dosyalarımızı ilettiğimizde yml içeriğimiz doğrudan ilgili template’e aktarılacak ve sonuç ekrana dökülecektir.

mustache data.yml template.mustache

Şimdide bir go dökümanı oluşturalım ve mustache template’i go kodumuzla ilişkilendirelim. Yazının giriş bölümünde de belirttiğim üzere öncelikle paketi geliştirmelerin devam ettiği fork üzerinden indirmeliyiz.

go get github.com/cbroglie/mustache

Örnek kodumuzu yine önceki yazılarda olduğu gibi Hello! My name is {{name}} {{surname}} ile oluşturalım.

package main
import (
 "github.com/cbroglie/mustache"
)
func main() {
 data, err := mustache.Render("Hello! My name is {{name}} {{surname}}", map[string]string{"name": "Chris", "surname": "Mcguire"})
 println(data)
 if err != nil {
  panic(err)
 }
}

mustache.Render() içerisinde yer tutucuları ve veriyi oluşturduğumuz map‘i barındıran iki alan yer almakta. Bu sayede, map[string]string{"name": "Chris", "surname": "Mcguire"} ile name ve surname için atadığımız değerler metin içerisindeki yer tutucular olan {{name}} {{surname}} ile yer değiştirmekte. Aşağıdaki bir diğer örneğimizde ise, mustache.ParseString() içeriğinde yer alan ifade belleğe alınmakta, for döngüsü ile tmpl.FRender() içeriğinden gelen değerle birleştirilerek ekrana dökülmekte.

package main

import (
 "github.com/cbroglie/mustache"
 "bytes"
 "fmt"
)

func main() {

 tmpl, _ := mustache.ParseString("hodor? {{c}}")

 var buf bytes.Buffer

 for i := 0; i < 10; i++ {
     tmpl.FRender(&buf, map[string]string{"c": "hodor! "})
     fmt.Printf("%v. output: %v\n", i+1, buf.String())
 }
}

go run ile kodumuzu uyguladığımızda aşağıdaki sonuç dönmektedir.

1. output: hodor? hodor!
2. output: hodor? hodor! hodor? hodor!
3. output: hodor? hodor! hodor? hodor! hodor? hodor!
4. output: hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor!
5. output: hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor!
6. output: hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor!
7. output: hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor!
8. output: hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor!
9. output: hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor!
10. output: hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor! hodor? hodor!

Go mustache paketinin kullanımına dair gerekli oldukça eklemeler yapmaya çalışacağım. Ancak, go'nun standart olarak kullanıma sunduğu template yapısının da oldukça kullanışlı olduğunu ve çoğu durumda tercihimin bu standart paketlerden yana olacağını da eklemeliyim.