123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- package ktgen
- import (
- "log"
- "os"
- "path/filepath"
- "text/template"
- "github.com/iancoleman/strcase"
- "github.com/tal-tech/go-zero/tools/goctl/api/spec"
- )
- const (
- apiBaseTemplate = `package {{.}}
- import com.google.gson.Gson
- import kotlinx.coroutines.Dispatchers
- import kotlinx.coroutines.withContext
- import java.io.BufferedReader
- import java.io.InputStreamReader
- import java.io.OutputStreamWriter
- import java.net.HttpURLConnection
- import java.net.URL
- const val SERVER = "http://localhost:8080"
- suspend fun apiPost(
- uri: String,
- body: Any,
- onOk: ((String) -> Unit)? = null,
- onFail: ((String) -> Unit)? = null,
- eventually: (() -> Unit)? = null
- ) = withContext(Dispatchers.IO) {
- val url = URL(SERVER + uri)
- with(url.openConnection() as HttpURLConnection) {
- requestMethod = "POST"
- headerFields["Content-Type"] = listOf("Application/json")
- val data = when (body) {
- is String -> {
- body
- }
- else -> {
- Gson().toJson(body)
- }
- }
- val wr = OutputStreamWriter(outputStream)
- wr.write(data)
- wr.flush()
- //response
- BufferedReader(InputStreamReader(inputStream)).use {
- val response = it.readText()
- if (responseCode == 200) {
- onOk?.invoke(response)
- } else {
- onFail?.invoke(response)
- }
- }
- }
- eventually?.invoke()
- }
- suspend fun apiGet(
- uri: String,
- onOk: ((String) -> Unit)? = null,
- onFail: ((String) -> Unit)? = null,
- eventually: (() -> Unit)? = null
- ) = withContext(Dispatchers.IO) {
- val url = URL(SERVER + uri)
- with(url.openConnection() as HttpURLConnection) {
- requestMethod = "POST"
- headerFields["Content-Type"] = listOf("Application/json")
- val wr = OutputStreamWriter(outputStream)
- wr.flush()
- //response
- BufferedReader(InputStreamReader(inputStream)).use {
- val response = it.readText()
- if (responseCode == 200) {
- onOk?.invoke(response)
- } else {
- onFail?.invoke(response)
- }
- }
- }
- eventually?.invoke()
- }
- `
- apiTemplate = `package {{with .Info}}{{.Title}}{{end}}
- import com.google.gson.Gson
- object Api{
- {{range .Types}}
- data class {{.Name}}({{$length := (len .Members)}}{{range $i,$item := .Members}}
- val {{with $item}}{{lowCamelCase .Name}}: {{parseType .Type}}{{end}}{{if ne $i (add $length -1)}},{{end}}{{end}}
- ){{end}}
- {{with .Service}}
- {{range .Routes}}suspend fun {{pathToFuncName .Path}}({{if ne .Method "get"}}
- req:{{with .RequestType}}{{.Name}},{{end}}{{end}}
- onOk: (({{with .ResponseType}}{{.Name}}{{end}}) -> Unit)? = null,
- onFail: ((String) -> Unit)? = null,
- eventually: (() -> Unit)? = null
- ){
- api{{if eq .Method "get"}}Get{{else}}Post{{end}}("{{.Path}}",{{if ne .Method "get"}}req,{{end}} onOk = {
- onOk?.invoke(Gson().fromJson(it,{{with .ResponseType}}{{.Name}}{{end}}::class.java))
- }, onFail = onFail, eventually =eventually)
- }
- {{end}}{{end}}
- }`
- )
- func genBase(dir, pkg string, api *spec.ApiSpec) error {
- e := os.MkdirAll(dir, 0755)
- if e != nil {
- return e
- }
- path := filepath.Join(dir, "BaseApi.kt")
- if _, e := os.Stat(path); e == nil {
- return nil
- }
- file, e := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
- if e != nil {
- return e
- }
- defer file.Close()
- t, e := template.New("n").Parse(apiBaseTemplate)
- if e != nil {
- return e
- }
- e = t.Execute(file, pkg)
- if e != nil {
- return e
- }
- return nil
- }
- func genApi(dir, pkg string, api *spec.ApiSpec) error {
- path := filepath.Join(dir, strcase.ToCamel(api.Info.Title+"Api")+".kt")
- api.Info.Title = pkg
- e := os.MkdirAll(dir, 0755)
- if e != nil {
- return e
- }
- file, e := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644)
- if e != nil {
- return e
- }
- defer file.Close()
- t, e := template.New("api").Funcs(funcsMap).Parse(apiTemplate)
- if e != nil {
- log.Fatal(e)
- }
- e = t.Execute(file, api)
- if e != nil {
- log.Fatal(e)
- }
- return nil
- }
|