85 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"fmt"
 | 
						|
	"os"
 | 
						|
	"strconv"
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
// const
 | 
						|
// nil, string, int, float64, bool, comparison
 | 
						|
// variables
 | 
						|
//   multiple short variables
 | 
						|
//   assignment?
 | 
						|
// if
 | 
						|
// error handling
 | 
						|
// functions
 | 
						|
//   returns
 | 
						|
//   defer
 | 
						|
// struct
 | 
						|
//   encoding/json
 | 
						|
// pointers
 | 
						|
// concurrency
 | 
						|
//   select
 | 
						|
//   chan receive
 | 
						|
// fmt
 | 
						|
//   Printf
 | 
						|
//   Sprintf
 | 
						|
//   Errorf
 | 
						|
// net/http
 | 
						|
//   Get
 | 
						|
// context/Context
 | 
						|
 | 
						|
// TODO: convert fmt calls to log
 | 
						|
// TODO: you can make the fetcher a library and main package the user
 | 
						|
// TODO: you can generate an html for the ship details? template pkg.
 | 
						|
 | 
						|
const timeout = 10 * time.Second
 | 
						|
 | 
						|
func main() {
 | 
						|
	args := os.Args[1:]
 | 
						|
	quit("give me a film id", len(args) != 1)
 | 
						|
 | 
						|
	id, err := strconv.Atoi(args[0])
 | 
						|
	quit("film id is incorrrect", err)
 | 
						|
 | 
						|
	ctx, cancel := context.WithTimeout(context.Background(), timeout)
 | 
						|
	defer cancel()
 | 
						|
 | 
						|
	// TODO: print the ship details to a text file (or any io.Writer)
 | 
						|
 | 
						|
	film, err := fetchFilm(ctx, id)
 | 
						|
	quit("Error occurred while fetching the film data", err)
 | 
						|
	fmt.Println(film)
 | 
						|
 | 
						|
	// a channel also can be used to print as they come
 | 
						|
	ships := make([]Starship, len(film.Starships))
 | 
						|
	err = fetchStarships(ctx, film.Starships, ships)
 | 
						|
	quit("Error occurred while fetching starships", err)
 | 
						|
 | 
						|
	fmt.Println("Ships used in the movie:")
 | 
						|
	fmt.Println("------------------------")
 | 
						|
	for _, ship := range ships {
 | 
						|
		fmt.Println(ship)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func quit(message string, cond interface{}) {
 | 
						|
	var quit bool
 | 
						|
 | 
						|
	switch v := cond.(type) {
 | 
						|
	case error:
 | 
						|
		quit = true
 | 
						|
		message += ": " + v.Error()
 | 
						|
	case bool:
 | 
						|
		quit = v
 | 
						|
	}
 | 
						|
 | 
						|
	if quit {
 | 
						|
		fmt.Fprintln(os.Stderr, message)
 | 
						|
		os.Exit(1)
 | 
						|
	}
 | 
						|
}
 |