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

Break long code sample into smaller pieces #1

Open
xrd opened this issue Jan 23, 2015 · 0 comments
Open

Break long code sample into smaller pieces #1

xrd opened this issue Jan 23, 2015 · 0 comments
Labels

Comments

@xrd
Copy link
Owner

xrd commented Jan 23, 2015

Section: https://github.com/xrd/advanced-github-oreilly/blob/jpoz/chapter-10-go.asciidoc#setting-up-our-webhooks-endpoint

I don't know how the long code snippet will read in a book format, as it might stretch into multiple pages. I had a lengthy code section in the android chapter (https://github.com/xrd/advanced-github-oreilly/blob/master/chapter-07-android.asciidoc#code-to-talk-to-github). I ended up breaking the large main function into a bunch of small subroutines, discussing the high level main function, and then having a different smaller section for each of the necessary subroutines. Something like this abbreviated main routine with the functions like main, webhookHandler and the others functions tubbed out. Then you could discuss the strategy after displaying this code snippet and afterwards have a level 3 header which discusses the implementation (and show the code sample) for each function. If you want me to take a stab at refactoring this, I'd be happy to.

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "os"
    "os/exec"

    "code.google.com/p/goauth2/oauth"
    "github.com/google/go-github/github"
)

var (
    accessToken = os.Getenv("GITHUB_ACCESS_TOKEN")
    transport   = &oauth.Transport{Token: &oauth.Token{AccessToken: accessToken}}
    client      = github.NewClient(transport.Client())
)

func main() {
    http.HandleFunc("/webhook", webhookHandler)

    fmt.Println("Listening on 4567")
    err := http.ListenAndServe(":4567", nil)
    fmt.Println(err)
}

func webhookHandler(w http.ResponseWriter, r *http.Request) {
    eventType := r.Header.Get("X-GitHub-Event")
    log.Printf("Received: %s event", eventType)

    if eventType != "push" {
        return
    }

    body, err := ioutil.ReadAll(r.Body)
    if err != nil {
        fmt.Println(err)
        return
    }

    payload := github.WebHookPayload{}
    json.Unmarshal(body, &payload)

  go run(payload)

    fmt.Fprintln(w, "OK")
    log.Printf("Responded: OK")
}

func run(payload github.WebHookPayload) {
  buffer, err := runMakeTest(payload)
  if err != nil {
    log.Printf("runMakeTest: %s", err)
  }

  log.Printf("%s", buffer)

  resp, err := commentOutput(payload, buffer)
  if err != nil {
    log.Printf("commentOutput: %s\n%s", err, resp.Body)
    return
  }
  log.Printf("Commented on: %s", *payload.HeadCommit.ID)
}

func runMakeTest(payload github.WebHookPayload) (*bytes.Buffer, error) {

}

func commentOutput(payload github.WebHookPayload, output *bytes.Buffer) (*github.Response, error) {

}
@xrd xrd added the golang label Jan 23, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant