github.com/rendon/cf@v0.0.0-20220806233241-5cb5d3939c03/setup.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"strconv"
     8  	"strings"
     9  
    10  	log "github.com/Sirupsen/logrus"
    11  	"github.com/codegangsta/cli"
    12  )
    13  
    14  func setup(c *cli.Context) {
    15  	if len(c.Args()) < 1 {
    16  		cli.ShowCommandHelp(c, "setup")
    17  		return
    18  	}
    19  
    20  	var cid, err = strconv.Atoi(c.Args()[0])
    21  	if err != nil {
    22  		log.Fatalf("%q is not a valid contest ID: %s", c.Args()[0], err)
    23  	}
    24  
    25  	var lang = c.String("lang")
    26  	if lang != "" {
    27  		if langs[lang] == nil {
    28  			log.Fatalf("No language with code %q was found.", lang)
    29  		}
    30  	}
    31  
    32  	cname, err := GetContestName(cid)
    33  	if err != nil {
    34  		log.Printf("Failed to get contest name, using ID instead.")
    35  		cname = fmt.Sprintf("%d", cid)
    36  	}
    37  
    38  	// Sanitize contest name to avoid problems with directory names
    39  	cname = strings.Replace(cname, " ", "", -1)
    40  	cname = strings.Replace(cname, "#", "", -1)
    41  	cname = strings.Replace(cname, "(", "", -1)
    42  	cname = strings.Replace(cname, ")", "", -1)
    43  
    44  	if err = os.MkdirAll(cname, 0755); err != nil {
    45  		log.Fatalf("Failed to create contest directory: %s", err)
    46  	}
    47  	for p := 'A'; p <= 'Z'; p++ {
    48  		var problemUrl = fmt.Sprintf("%s/contest/%d/problem/%c", baseURL, cid, p)
    49  		var ins, outs, err = ParseProblem(problemUrl)
    50  		if err != nil {
    51  			break
    52  		}
    53  		var dir = fmt.Sprintf("%s/%c", cname, p)
    54  		if err = os.MkdirAll(dir, 0775); err != nil {
    55  			log.Fatalf("Failed to create directory: %s", err)
    56  		}
    57  		for i := 1; i <= len(ins); i++ {
    58  			if err = WriteTest(ins[i-1], outs[i-1], dir, i); err != nil {
    59  				log.Fatalf("Problem %c: %s", p, err)
    60  			}
    61  		}
    62  
    63  		var settings = map[string]interface{}{
    64  			"tests":      len(ins),
    65  			"problemUrl": problemUrl,
    66  		}
    67  		if lang != "" {
    68  			var sourceFile = fmt.Sprintf("%s/main.%s", dir, lang)
    69  			if err = GenerateSampleSolution(sourceFile, problemUrl); err != nil {
    70  				log.Printf("Failed to generate sample solution: %s", err)
    71  			}
    72  			settings["lang"] = lang
    73  			settings["sourceFile"] = filepath.Base(sourceFile)
    74  		}
    75  
    76  		err = WriteKeyValueYamlFile(dir+"/.settings.yml", settings)
    77  		if err != nil {
    78  			log.Fatalf("%c: Failed to write settings file: %s", p, err)
    79  		}
    80  		fmt.Printf("Problem %c is ready!\n", p)
    81  	}
    82  	fmt.Printf("\nContest directory: %s/\n", cname)
    83  }