Skip to content
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

Restructure #24

Open
wants to merge 19 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
build/gojson: format test
mkdir -p build
go build -o build/gojson ./gojson
build: format test
go build -o build/gojson cmd/gojson/gojson.go

test:
go test -v

format:
gofmt -w -e -s -l *.go **/*.go
gofmt -w -e -s -l *.go **.go

clean:
rm -rf build
Expand Down
36 changes: 20 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,23 +100,15 @@ type Repository struct {
}
```

CLI Installation
Installation
----------------

```sh
$ go get github.com/ChimeraCoder/gojson/gojson
$ go get github.com/ChimeraCoder/gojson/...
```

Assuming `$GOPATH/bin` is in your `PATH`, you can now invoke `gojson` directly.


API Installation
----------------

```sh
$ go get github.com/ChimeraCoder/gojson
```

Development
-----------

Expand All @@ -126,24 +118,36 @@ $ cd gojson
$ go test
```

**Building CLI**
**Building**

```
$ go build -o _build/gojson ./gojson
$ make build
```

**Installing CLI**
**Formatting**

```
$ go install ./gojson
$ make format
```

**Formatting**
**Testing**

```
$ gofmt -w -e -s -l .
$ make test
```


Documentation
-----------
Use godoc to see further documentation

```
godoc -http=:6060
```

open browser to http://localhost:6060/pkg/github.com/ChimeraCoder/gojson/


Related Work
------------

Expand Down
64 changes: 64 additions & 0 deletions cmd/gojson/gojson.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package main

import (
"flag"
"fmt"
"io"
"io/ioutil"
"log"
"os"

"github.com/ChimeraCoder/gojson"
)

var (
name = flag.String("name", "Foo", "the name of the struct")
pkg = flag.String("pkg", "main", "the name of the package for the generated code")
inputName = flag.String("input", "", "the name of the input file containing JSON (if input not provided via STDIN)")
outputName = flag.String("o", "", "the name of the file to write the output to (outputs to STDOUT by default)")
)

func main() {
flag.Parse()

if isInteractive() && *inputName == "" {
flag.Usage()
fmt.Fprintln(os.Stderr, "Expects input on stdin")
os.Exit(1)
}

var input io.Reader
input = os.Stdin
if *inputName != "" {
f, err := os.Open(*inputName)
if err != nil {
log.Fatalf("reading input file: %s", err)
}
defer f.Close()
input = f
}

if output, err := gojson.Generate(input, *name, *pkg); err != nil {
fmt.Fprintln(os.Stderr, "error parsing", err)
os.Exit(1)
} else {
if *outputName != "" {
err := ioutil.WriteFile(*outputName, output, 0644)
if err != nil {
log.Fatalf("writing output: %s", err)
}
} else {
fmt.Print(string(output))
}
}

}

// Return true if os.Stdin appears to be interactive
func isInteractive() bool {
fileInfo, err := os.Stdin.Stat()
if err != nil {
return false
}
return fileInfo.Mode()&(os.ModeCharDevice|os.ModeCharDevice) != 0
}
115 changes: 115 additions & 0 deletions doc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
/*
GoJson generates go struct defintions from JSON documents

It reads from stdin and prints to stdout.

Usage:
gojson [flags]

The flags are:
-name
the name of the struct
-pkg
the name of the package for the generated code
-inputName
the name of the input file containing JSON (if input not provided via STDIN)
-outputName
the name of the file to write the output to (outputs to STDOUT by default)

Examples

Convert resulting json of an endpoint,
giving the resulting struct the name "Repository"

curl -s https://api.github.com/repos/chimeracoder/gojson | gojson -name=Repository

Output:

type Repository struct {
ArchiveURL string `json:"archive_url"`
AssigneesURL string `json:"assignees_url"`
BlobsURL string `json:"blobs_url"`
BranchesURL string `json:"branches_url"`
CloneURL string `json:"clone_url"`
CollaboratorsURL string `json:"collaborators_url"`
CommentsURL string `json:"comments_url"`
CommitsURL string `json:"commits_url"`
CompareURL string `json:"compare_url"`
ContentsURL string `json:"contents_url"`
ContributorsURL string `json:"contributors_url"`
CreatedAt string `json:"created_at"`
DefaultBranch string `json:"default_branch"`
Description string `json:"description"`
DownloadsURL string `json:"downloads_url"`
EventsURL string `json:"events_url"`
Fork bool `json:"fork"`
Forks float64 `json:"forks"`
ForksCount float64 `json:"forks_count"`
ForksURL string `json:"forks_url"`
FullName string `json:"full_name"`
GitCommitsURL string `json:"git_commits_url"`
GitRefsURL string `json:"git_refs_url"`
GitTagsURL string `json:"git_tags_url"`
GitURL string `json:"git_url"`
HasDownloads bool `json:"has_downloads"`
HasIssues bool `json:"has_issues"`
HasWiki bool `json:"has_wiki"`
Homepage interface{} `json:"homepage"`
HooksURL string `json:"hooks_url"`
HtmlURL string `json:"html_url"`
ID float64 `json:"id"`
IssueCommentURL string `json:"issue_comment_url"`
IssueEventsURL string `json:"issue_events_url"`
IssuesURL string `json:"issues_url"`
KeysURL string `json:"keys_url"`
LabelsURL string `json:"labels_url"`
Language string `json:"language"`
LanguagesURL string `json:"languages_url"`
MasterBranch string `json:"master_branch"`
MergesURL string `json:"merges_url"`
MilestonesURL string `json:"milestones_url"`
MirrorURL interface{} `json:"mirror_url"`
Name string `json:"name"`
NetworkCount float64 `json:"network_count"`
NotificationsURL string `json:"notifications_url"`
OpenIssues float64 `json:"open_issues"`
OpenIssuesCount float64 `json:"open_issues_count"`
Owner struct {
AvatarURL string `json:"avatar_url"`
EventsURL string `json:"events_url"`
FollowersURL string `json:"followers_url"`
FollowingURL string `json:"following_url"`
GistsURL string `json:"gists_url"`
GravatarID string `json:"gravatar_id"`
HtmlURL string `json:"html_url"`
ID float64 `json:"id"`
Login string `json:"login"`
OrganizationsURL string `json:"organizations_url"`
ReceivedEventsURL string `json:"received_events_url"`
ReposURL string `json:"repos_url"`
SiteAdmin bool `json:"site_admin"`
StarredURL string `json:"starred_url"`
SubscriptionsURL string `json:"subscriptions_url"`
Type string `json:"type"`
URL string `json:"url"`
} `json:"owner"`
Private bool `json:"private"`
PullsURL string `json:"pulls_url"`
PushedAt string `json:"pushed_at"`
Size float64 `json:"size"`
SshURL string `json:"ssh_url"`
StargazersURL string `json:"stargazers_url"`
StatusesURL string `json:"statuses_url"`
SubscribersURL string `json:"subscribers_url"`
SubscriptionURL string `json:"subscription_url"`
SvnURL string `json:"svn_url"`
TagsURL string `json:"tags_url"`
TeamsURL string `json:"teams_url"`
TreesURL string `json:"trees_url"`
UpdatedAt string `json:"updated_at"`
URL string `json:"url"`
Watchers float64 `json:"watchers"`
WatchersCount float64 `json:"watchers_count"`
}
*/
package gojson
25 changes: 25 additions & 0 deletions example_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package gojson_test

import (
"fmt"
"strings"

"github.com/ChimeraCoder/gojson"
)

func ExampleGenerate() {
structName := "test"
pkgName := "main"
input := strings.NewReader(`{"sample":"json"}`)
goStruct, err := gojson.Generate(input, structName, pkgName)
if err != nil {
fmt.Printf("Error generating json: %s", err.Error())
}
fmt.Printf("%s", goStruct)
// Output:
// package main
//
// type test struct {
// Sample string `json:"sample"`
// }
}
106 changes: 0 additions & 106 deletions gojson/gojson.go

This file was deleted.

Loading