2019-10-30 19:34:44 +03:00
|
|
|
// Copyright © 2018 Inanc Gumus
|
|
|
|
// Learn Go Programming Course
|
|
|
|
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
|
|
|
|
//
|
|
|
|
// For more tutorials : https://learngoprogramming.com
|
|
|
|
// In-person training : https://www.linkedin.com/in/inancgumus/
|
|
|
|
// Follow me on twitter: https://twitter.com/inancgumus
|
|
|
|
|
2019-04-26 21:32:20 +03:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|