Skip to content

chore: generate countries.tsx from Go code #15274

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Nov 15, 2024
31 changes: 4 additions & 27 deletions cli/login.go
Original file line number Diff line number Diff line change
Expand Up @@ -530,36 +530,13 @@ func promptDevelopers(inv *serpent.Invocation) (string, error) {
}

func promptCountry(inv *serpent.Invocation) (string, error) {
countries := []string{
"Afghanistan", "Åland Islands", "Albania", "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla", "Antarctica", "Antigua and Barbuda",
"Argentina", "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan", "Bahamas", "Bahrain", "Bangladesh", "Barbados",
"Belarus", "Belgium", "Belize", "Benin", "Bermuda", "Bhutan", "Bolivia, Plurinational State of", "Bonaire, Sint Eustatius and Saba", "Bosnia and Herzegovina", "Botswana",
"Bouvet Island", "Brazil", "British Indian Ocean Territory", "Brunei Darussalam", "Bulgaria", "Burkina Faso", "Burundi", "Cambodia", "Cameroon", "Canada",
"Cape Verde", "Cayman Islands", "Central African Republic", "Chad", "Chile", "China", "Christmas Island", "Cocos (Keeling) Islands", "Colombia", "Comoros",
"Congo", "Congo, the Democratic Republic of the", "Cook Islands", "Costa Rica", "Côte d'Ivoire", "Croatia", "Cuba", "Curaçao", "Cyprus", "Czech Republic",
"Denmark", "Djibouti", "Dominica", "Dominican Republic", "Ecuador", "Egypt", "El Salvador", "Equatorial Guinea", "Eritrea", "Estonia",
"Ethiopia", "Falkland Islands (Malvinas)", "Faroe Islands", "Fiji", "Finland", "France", "French Guiana", "French Polynesia", "French Southern Territories", "Gabon",
"Gambia", "Georgia", "Germany", "Ghana", "Gibraltar", "Greece", "Greenland", "Grenada", "Guadeloupe", "Guam",
"Guatemala", "Guernsey", "Guinea", "Guinea-Bissau", "Guyana", "Haiti", "Heard Island and McDonald Islands", "Holy See (Vatican City State)", "Honduras", "Hong Kong",
"Hungary", "Iceland", "India", "Indonesia", "Iran, Islamic Republic of", "Iraq", "Ireland", "Isle of Man", "Israel", "Italy",
"Jamaica", "Japan", "Jersey", "Jordan", "Kazakhstan", "Kenya", "Kiribati", "Korea, Democratic People's Republic of", "Korea, Republic of", "Kuwait",
"Kyrgyzstan", "Lao People's Democratic Republic", "Latvia", "Lebanon", "Lesotho", "Liberia", "Libya", "Liechtenstein", "Lithuania", "Luxembourg",
"Macao", "Macedonia, the Former Yugoslav Republic of", "Madagascar", "Malawi", "Malaysia", "Maldives", "Mali", "Malta", "Marshall Islands", "Martinique",
"Mauritania", "Mauritius", "Mayotte", "Mexico", "Micronesia, Federated States of", "Moldova, Republic of", "Monaco", "Mongolia", "Montenegro", "Montserrat",
"Morocco", "Mozambique", "Myanmar", "Namibia", "Nauru", "Nepal", "Netherlands", "New Caledonia", "New Zealand", "Nicaragua",
"Niger", "Nigeria", "Niue", "Norfolk Island", "Northern Mariana Islands", "Norway", "Oman", "Pakistan", "Palau", "Palestine, State of",
"Panama", "Papua New Guinea", "Paraguay", "Peru", "Philippines", "Pitcairn", "Poland", "Portugal", "Puerto Rico", "Qatar",
"Réunion", "Romania", "Russian Federation", "Rwanda", "Saint Barthélemy", "Saint Helena, Ascension and Tristan da Cunha", "Saint Kitts and Nevis", "Saint Lucia", "Saint Martin (French part)", "Saint Pierre and Miquelon",
"Saint Vincent and the Grenadines", "Samoa", "San Marino", "Sao Tome and Principe", "Saudi Arabia", "Senegal", "Serbia", "Seychelles", "Sierra Leone", "Singapore",
"Sint Maarten (Dutch part)", "Slovakia", "Slovenia", "Solomon Islands", "Somalia", "South Africa", "South Georgia and the South Sandwich Islands", "South Sudan", "Spain", "Sri Lanka",
"Sudan", "Suriname", "Svalbard and Jan Mayen", "Swaziland", "Sweden", "Switzerland", "Syrian Arab Republic", "Taiwan, Province of China", "Tajikistan", "Tanzania, United Republic of",
"Thailand", "Timor-Leste", "Togo", "Tokelau", "Tonga", "Trinidad and Tobago", "Tunisia", "Turkey", "Turkmenistan", "Turks and Caicos Islands",
"Tuvalu", "Uganda", "Ukraine", "United Arab Emirates", "United Kingdom", "United States", "United States Minor Outlying Islands", "Uruguay", "Uzbekistan", "Vanuatu",
"Venezuela, Bolivarian Republic of", "Vietnam", "Virgin Islands, British", "Virgin Islands, U.S.", "Wallis and Futuna", "Western Sahara", "Yemen", "Zambia", "Zimbabwe",
options := make([]string, len(codersdk.Countries))
for i, country := range codersdk.Countries {
options[i] = country.Name
}

selection, err := cliui.Select(inv, cliui.SelectOptions{
Options: countries,
Options: options,
Message: "Select the country:",
HideSearch: false,
})
Expand Down
259 changes: 259 additions & 0 deletions codersdk/countries.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,259 @@
package codersdk

var Countries = []Country{
{Name: "Afghanistan", Flag: "🇦🇫"},
{Name: "Åland Islands", Flag: "🇦🇽"},
{Name: "Albania", Flag: "🇦🇱"},
{Name: "Algeria", Flag: "🇩🇿"},
{Name: "American Samoa", Flag: "🇦🇸"},
{Name: "Andorra", Flag: "🇦🇩"},
{Name: "Angola", Flag: "🇦🇴"},
{Name: "Anguilla", Flag: "🇦🇮"},
{Name: "Antarctica", Flag: "🇦🇶"},
{Name: "Antigua and Barbuda", Flag: "🇦🇬"},
{Name: "Argentina", Flag: "🇦🇷"},
{Name: "Armenia", Flag: "🇦🇲"},
{Name: "Aruba", Flag: "🇦🇼"},
{Name: "Australia", Flag: "🇦🇺"},
{Name: "Austria", Flag: "🇦🇹"},
{Name: "Azerbaijan", Flag: "🇦🇿"},
{Name: "Bahamas", Flag: "🇧🇸"},
{Name: "Bahrain", Flag: "🇧🇭"},
{Name: "Bangladesh", Flag: "🇧🇩"},
{Name: "Barbados", Flag: "🇧🇧"},
{Name: "Belarus", Flag: "🇧🇾"},
{Name: "Belgium", Flag: "🇧🇪"},
{Name: "Belize", Flag: "🇧🇿"},
{Name: "Benin", Flag: "🇧🇯"},
{Name: "Bermuda", Flag: "🇧🇲"},
{Name: "Bhutan", Flag: "🇧🇹"},
{Name: "Bolivia, Plurinational State of", Flag: "🇧🇴"},
{Name: "Bonaire, Sint Eustatius and Saba", Flag: "🇧🇶"},
{Name: "Bosnia and Herzegovina", Flag: "🇧🇦"},
{Name: "Botswana", Flag: "🇧🇼"},
{Name: "Bouvet Island", Flag: "🇧🇻"},
{Name: "Brazil", Flag: "🇧🇷"},
{Name: "British Indian Ocean Territory", Flag: "🇮🇴"},
{Name: "Brunei Darussalam", Flag: "🇧🇳"},
{Name: "Bulgaria", Flag: "🇧🇬"},
{Name: "Burkina Faso", Flag: "🇧🇫"},
{Name: "Burundi", Flag: "🇧🇮"},
{Name: "Cambodia", Flag: "🇰🇭"},
{Name: "Cameroon", Flag: "🇨🇲"},
{Name: "Canada", Flag: "🇨🇦"},
{Name: "Cape Verde", Flag: "🇨🇻"},
{Name: "Cayman Islands", Flag: "🇰🇾"},
{Name: "Central African Republic", Flag: "🇨🇫"},
{Name: "Chad", Flag: "🇹🇩"},
{Name: "Chile", Flag: "🇨🇱"},
{Name: "China", Flag: "🇨🇳"},
{Name: "Christmas Island", Flag: "🇨🇽"},
{Name: "Cocos (Keeling) Islands", Flag: "🇨🇨"},
{Name: "Colombia", Flag: "🇨🇴"},
{Name: "Comoros", Flag: "🇰🇲"},
{Name: "Congo", Flag: "🇨🇬"},
{Name: "Congo, the Democratic Republic of the", Flag: "🇨🇩"},
{Name: "Cook Islands", Flag: "🇨🇰"},
{Name: "Costa Rica", Flag: "🇨🇷"},
{Name: "Côte d'Ivoire", Flag: "🇨🇮"},
{Name: "Croatia", Flag: "🇭🇷"},
{Name: "Cuba", Flag: "🇨🇺"},
{Name: "Curaçao", Flag: "🇨🇼"},
{Name: "Cyprus", Flag: "🇨🇾"},
{Name: "Czech Republic", Flag: "🇨🇿"},
{Name: "Denmark", Flag: "🇩🇰"},
{Name: "Djibouti", Flag: "🇩🇯"},
{Name: "Dominica", Flag: "🇩🇲"},
{Name: "Dominican Republic", Flag: "🇩🇴"},
{Name: "Ecuador", Flag: "🇪🇨"},
{Name: "Egypt", Flag: "🇪🇬"},
{Name: "El Salvador", Flag: "🇸🇻"},
{Name: "Equatorial Guinea", Flag: "🇬🇶"},
{Name: "Eritrea", Flag: "🇪🇷"},
{Name: "Estonia", Flag: "🇪🇪"},
{Name: "Ethiopia", Flag: "🇪🇹"},
{Name: "Falkland Islands (Malvinas)", Flag: "🇫🇰"},
{Name: "Faroe Islands", Flag: "🇫🇴"},
{Name: "Fiji", Flag: "🇫🇯"},
{Name: "Finland", Flag: "🇫🇮"},
{Name: "France", Flag: "🇫🇷"},
{Name: "French Guiana", Flag: "🇬🇫"},
{Name: "French Polynesia", Flag: "🇵🇫"},
{Name: "French Southern Territories", Flag: "🇹🇫"},
{Name: "Gabon", Flag: "🇬🇦"},
{Name: "Gambia", Flag: "🇬🇲"},
{Name: "Georgia", Flag: "🇬🇪"},
{Name: "Germany", Flag: "🇩🇪"},
{Name: "Ghana", Flag: "🇬🇭"},
{Name: "Gibraltar", Flag: "🇬🇮"},
{Name: "Greece", Flag: "🇬🇷"},
{Name: "Greenland", Flag: "🇬🇱"},
{Name: "Grenada", Flag: "🇬🇩"},
{Name: "Guadeloupe", Flag: "🇬🇵"},
{Name: "Guam", Flag: "🇬🇺"},
{Name: "Guatemala", Flag: "🇬🇹"},
{Name: "Guernsey", Flag: "🇬🇬"},
{Name: "Guinea", Flag: "🇬🇳"},
{Name: "Guinea-Bissau", Flag: "🇬🇼"},
{Name: "Guyana", Flag: "🇬🇾"},
{Name: "Haiti", Flag: "🇭🇹"},
{Name: "Heard Island and McDonald Islands", Flag: "🇭🇲"},
{Name: "Holy See (Vatican City State)", Flag: "🇻🇦"},
{Name: "Honduras", Flag: "🇭🇳"},
{Name: "Hong Kong", Flag: "🇭🇰"},
{Name: "Hungary", Flag: "🇭🇺"},
{Name: "Iceland", Flag: "🇮🇸"},
{Name: "India", Flag: "🇮🇳"},
{Name: "Indonesia", Flag: "🇮🇩"},
{Name: "Iran, Islamic Republic of", Flag: "🇮🇷"},
{Name: "Iraq", Flag: "🇮🇶"},
{Name: "Ireland", Flag: "🇮🇪"},
{Name: "Isle of Man", Flag: "🇮🇲"},
{Name: "Israel", Flag: "🇮🇱"},
{Name: "Italy", Flag: "🇮🇹"},
{Name: "Jamaica", Flag: "🇯🇲"},
{Name: "Japan", Flag: "🇯🇵"},
{Name: "Jersey", Flag: "🇯🇪"},
{Name: "Jordan", Flag: "🇯🇴"},
{Name: "Kazakhstan", Flag: "🇰🇿"},
{Name: "Kenya", Flag: "🇰🇪"},
{Name: "Kiribati", Flag: "🇰🇮"},
{Name: "Korea, Democratic People's Republic of", Flag: "🇰🇵"},
{Name: "Korea, Republic of", Flag: "🇰🇷"},
{Name: "Kuwait", Flag: "🇰🇼"},
{Name: "Kyrgyzstan", Flag: "🇰🇬"},
{Name: "Lao People's Democratic Republic", Flag: "🇱🇦"},
{Name: "Latvia", Flag: "🇱🇻"},
{Name: "Lebanon", Flag: "🇱🇧"},
{Name: "Lesotho", Flag: "🇱🇸"},
{Name: "Liberia", Flag: "🇱🇷"},
{Name: "Libya", Flag: "🇱🇾"},
{Name: "Liechtenstein", Flag: "🇱🇮"},
{Name: "Lithuania", Flag: "🇱🇹"},
{Name: "Luxembourg", Flag: "🇱🇺"},
{Name: "Macao", Flag: "🇲🇴"},
{Name: "Macedonia, the Former Yugoslav Republic of", Flag: "🇲🇰"},
{Name: "Madagascar", Flag: "🇲🇬"},
{Name: "Malawi", Flag: "🇲🇼"},
{Name: "Malaysia", Flag: "🇲🇾"},
{Name: "Maldives", Flag: "🇲🇻"},
{Name: "Mali", Flag: "🇲🇱"},
{Name: "Malta", Flag: "🇲🇹"},
{Name: "Marshall Islands", Flag: "🇲🇭"},
{Name: "Martinique", Flag: "🇲🇶"},
{Name: "Mauritania", Flag: "🇲🇷"},
{Name: "Mauritius", Flag: "🇲🇺"},
{Name: "Mayotte", Flag: "🇾🇹"},
{Name: "Mexico", Flag: "🇲🇽"},
{Name: "Micronesia, Federated States of", Flag: "🇫🇲"},
{Name: "Moldova, Republic of", Flag: "🇲🇩"},
{Name: "Monaco", Flag: "🇲🇨"},
{Name: "Mongolia", Flag: "🇲🇳"},
{Name: "Montenegro", Flag: "🇲🇪"},
{Name: "Montserrat", Flag: "🇲🇸"},
{Name: "Morocco", Flag: "🇲🇦"},
{Name: "Mozambique", Flag: "🇲🇿"},
{Name: "Myanmar", Flag: "🇲🇲"},
{Name: "Namibia", Flag: "🇳🇦"},
{Name: "Nauru", Flag: "🇳🇷"},
{Name: "Nepal", Flag: "🇳🇵"},
{Name: "Netherlands", Flag: "🇳🇱"},
{Name: "New Caledonia", Flag: "🇳🇨"},
{Name: "New Zealand", Flag: "🇳🇿"},
{Name: "Nicaragua", Flag: "🇳🇮"},
{Name: "Niger", Flag: "🇳🇪"},
{Name: "Nigeria", Flag: "🇳🇬"},
{Name: "Niue", Flag: "🇳🇺"},
{Name: "Norfolk Island", Flag: "🇳🇫"},
{Name: "Northern Mariana Islands", Flag: "🇲🇵"},
{Name: "Norway", Flag: "🇳🇴"},
{Name: "Oman", Flag: "🇴🇲"},
{Name: "Pakistan", Flag: "🇵🇰"},
{Name: "Palau", Flag: "🇵🇼"},
{Name: "Palestine, State of", Flag: "🇵🇸"},
{Name: "Panama", Flag: "🇵🇦"},
{Name: "Papua New Guinea", Flag: "🇵🇬"},
{Name: "Paraguay", Flag: "🇵🇾"},
{Name: "Peru", Flag: "🇵🇪"},
{Name: "Philippines", Flag: "🇵🇭"},
{Name: "Pitcairn", Flag: "🇵🇳"},
{Name: "Poland", Flag: "🇵🇱"},
{Name: "Portugal", Flag: "🇵🇹"},
{Name: "Puerto Rico", Flag: "🇵🇷"},
{Name: "Qatar", Flag: "🇶🇦"},
{Name: "Réunion", Flag: "🇷🇪"},
{Name: "Romania", Flag: "🇷🇴"},
{Name: "Russian Federation", Flag: "🇷🇺"},
{Name: "Rwanda", Flag: "🇷🇼"},
{Name: "Saint Barthélemy", Flag: "🇧🇱"},
{Name: "Saint Helena, Ascension and Tristan da Cunha", Flag: "🇸🇭"},
{Name: "Saint Kitts and Nevis", Flag: "🇰🇳"},
{Name: "Saint Lucia", Flag: "🇱🇨"},
{Name: "Saint Martin (French part)", Flag: "🇲🇫"},
{Name: "Saint Pierre and Miquelon", Flag: "🇵🇲"},
{Name: "Saint Vincent and the Grenadines", Flag: "🇻🇨"},
{Name: "Samoa", Flag: "🇼🇸"},
{Name: "San Marino", Flag: "🇸🇲"},
{Name: "Sao Tome and Principe", Flag: "🇸🇹"},
{Name: "Saudi Arabia", Flag: "🇸🇦"},
{Name: "Senegal", Flag: "🇸🇳"},
{Name: "Serbia", Flag: "🇷🇸"},
{Name: "Seychelles", Flag: "🇸🇨"},
{Name: "Sierra Leone", Flag: "🇸🇱"},
{Name: "Singapore", Flag: "🇸🇬"},
{Name: "Sint Maarten (Dutch part)", Flag: "🇸🇽"},
{Name: "Slovakia", Flag: "🇸🇰"},
{Name: "Slovenia", Flag: "🇸🇮"},
{Name: "Solomon Islands", Flag: "🇸🇧"},
{Name: "Somalia", Flag: "🇸🇴"},
{Name: "South Africa", Flag: "🇿🇦"},
{Name: "South Georgia and the South Sandwich Islands", Flag: "🇬🇸"},
{Name: "South Sudan", Flag: "🇸🇸"},
{Name: "Spain", Flag: "🇪🇸"},
{Name: "Sri Lanka", Flag: "🇱🇰"},
{Name: "Sudan", Flag: "🇸🇩"},
{Name: "Suriname", Flag: "🇸🇷"},
{Name: "Svalbard and Jan Mayen", Flag: "🇸🇯"},
{Name: "Swaziland", Flag: "🇸🇿"},
{Name: "Sweden", Flag: "🇸🇪"},
{Name: "Switzerland", Flag: "🇨🇭"},
{Name: "Syrian Arab Republic", Flag: "🇸🇾"},
{Name: "Taiwan, Province of China", Flag: "🇹🇼"},
{Name: "Tajikistan", Flag: "🇹🇯"},
{Name: "Tanzania, United Republic of", Flag: "🇹🇿"},
{Name: "Thailand", Flag: "🇹🇭"},
{Name: "Timor-Leste", Flag: "🇹🇱"},
{Name: "Togo", Flag: "🇹🇬"},
{Name: "Tokelau", Flag: "🇹🇰"},
{Name: "Tonga", Flag: "🇹🇴"},
{Name: "Trinidad and Tobago", Flag: "🇹🇹"},
{Name: "Tunisia", Flag: "🇹🇳"},
{Name: "Turkey", Flag: "🇹🇷"},
{Name: "Turkmenistan", Flag: "🇹🇲"},
{Name: "Turks and Caicos Islands", Flag: "🇹🇨"},
{Name: "Tuvalu", Flag: "🇹🇻"},
{Name: "Uganda", Flag: "🇺🇬"},
{Name: "Ukraine", Flag: "🇺🇦"},
{Name: "United Arab Emirates", Flag: "🇦🇪"},
{Name: "United Kingdom", Flag: "🇬🇧"},
{Name: "United States", Flag: "🇺🇸"},
{Name: "United States Minor Outlying Islands", Flag: "🇺🇲"},
{Name: "Uruguay", Flag: "🇺🇾"},
{Name: "Uzbekistan", Flag: "🇺🇿"},
{Name: "Vanuatu", Flag: "🇻🇺"},
{Name: "Venezuela, Bolivarian Republic of", Flag: "🇻🇪"},
{Name: "Vietnam", Flag: "🇻🇳"},
{Name: "Virgin Islands, British", Flag: "🇻🇬"},
{Name: "Virgin Islands, U.S.", Flag: "🇻🇮"},
{Name: "Wallis and Futuna", Flag: "🇼🇫"},
{Name: "Western Sahara", Flag: "🇪🇭"},
{Name: "Yemen", Flag: "🇾🇪"},
{Name: "Zambia", Flag: "🇿🇲"},
{Name: "Zimbabwe", Flag: "🇿🇼"},
}

// @typescript-ignore Country
type Country struct {
Name string `json:"name"`
Flag string `json:"flag"`
}
33 changes: 33 additions & 0 deletions scripts/apitypings/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package main
import (
"bytes"
"context"
"encoding/json"
"fmt"
"go/types"
"os"
Expand All @@ -24,6 +25,7 @@ import (
"cdr.dev/slog"
"cdr.dev/slog/sloggers/sloghuman"
"github.com/coder/coder/v2/coderd/util/slice"
"github.com/coder/coder/v2/codersdk"
)

var (
Expand Down Expand Up @@ -57,6 +59,14 @@ func main() {
}

_, _ = fmt.Print("// Code generated by 'make site/src/api/typesGenerated.ts'. DO NOT EDIT.\n\n")

countriesTS, err := generateSliceOfObjectsTypeScript("countries", codersdk.Countries)
if err != nil {
log.Fatal(ctx, fmt.Sprintf("generate countries typeScript: %s", err.Error()))
}
_, _ = fmt.Print("// The code below is generated from codersdk/countries.go.\n")
_, _ = fmt.Print(countriesTS, "\n")

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To do this correctly, we should not have to specify codersdk.Countries. We should implement it here:

case *types.Var:
// TODO: Are any enums var declarations? This is also codersdk.Me.

I feel a bit apprehensive to import codersdk into this tool.

We could make it a new generator (:cry:) or actually auto-gen vars from the codersdk package (like codersdk.Me).

If we do the vars, we might want to have some opt-in comment. Idk how many var declarations we have

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should really have a general autogen tool and pattern for these. When the types are in Go and no package AST parsing is necessary.

rbacgen is an example.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Emyrk

got it, will implement a general autogen tool. As suggested, I'm thinking of doing it similar to how rbacgen is done.

So the autogen tool will be under scripts/valuegen which contains main.go which is the script itself and typescript.tstmpl which will be the TS template to which we will convert the countries.go

var Countries = []Country{

If similar types conversion needs are needed in the future for other types in Go, it can be handled in the script to use the same typescriptconst.tstmpl template or a different one based on the need.

does that make sense? wdyt?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@joobisb That all sounds reasonable. It'll probably throw into a different .ts file.

It would be awesome if rbacgen and valuegen could be merged into 1 😄

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Emyrk I have updated the scripts and have merged both into a single typegen script, please do have a look

for _, baseDir := range baseDirs {
_, _ = fmt.Printf("// The code below is generated from %s.\n\n", strings.TrimPrefix(baseDir, "./"))
output, err := Generate(baseDir, external...)
Expand Down Expand Up @@ -1105,3 +1115,26 @@ func (Generator) isBuiltIn(name string) (bool, string) {
func indentedComment(comment string) string {
return fmt.Sprintf("%s// %s", indent, comment)
}

func generateSliceOfObjectsTypeScript(name string, data interface{}) (string, error) {
var sb strings.Builder
_, _ = sb.WriteString(fmt.Sprintf("export const %s = [\n", name))

val := reflect.ValueOf(data)
if val.Kind() != reflect.Slice {
return "", xerrors.New("data must be a slice")
}

for i := 0; i < val.Len(); i++ {
item := val.Index(i).Interface()
jsonBytes, err := json.Marshal(item)
if err != nil {
return "", xerrors.Errorf("marshal item: %w", err)
}
_, _ = sb.WriteString("\t")
_, _ = sb.Write(jsonBytes)
_, _ = sb.WriteString(",\n")
}
_, _ = sb.WriteString("]\n\n")
return sb.String(), nil
}
Loading
Loading