func main() { p := argparse.New("A minimal Go compiler for K750") p.Argument("Dir", 1, argparse.Store, "dir", "The package directory to compile. It should contain a 'main' package.") args := &Args{} err := p.Parse(args) if err != nil { if cmdLineErr, ok := err.(argparse.CommandLineError); ok { ansi.Fprintln(os.Stderr, ansi.RedBold, string(cmdLineErr)) p.Usage() os.Exit(2) } else { ansi.Fprintf(os.Stderr, ansi.RedBold, "Error: %s\n", err.Error()) os.Exit(1) } } fset := token.NewFileSet() pkgs, err := parser.ParseDir(fset, args.Dir, nil, parser.DeclarationErrors) if err != nil { ansi.Fprintf(os.Stderr, ansi.RedBold, "Error: %s\n", err.Error()) os.Exit(1) } pkg, ok := pkgs["main"] if !ok { ansi.Fprintf(os.Stderr, ansi.RedBold, "Error: main package was not found.") os.Exit(1) } file := ast.MergePackageFiles(pkg, ast.FilterFuncDuplicates|ast.FilterImportDuplicates) emitHeader() defer emitFooter() ast.Walk(NewFileVisitor(), file) }
func main() { p := argparse.New("A SPARQL query & update client") p.Argument("Endpoint", 1, argparse.Store, "endpoint_uri", "The SPARQL endpoint URI. It is used for all query operations, and update operations when -u is not specified.") p.Option('u', "update-endpoint", "UpdateEndpoint", 1, argparse.Store, "URI", "An alternative endpoint URI that is only used for SPARQL update operations. Default: use the query endpoint URI.") p.Option('f', "fuseki", "UseFuseki", 0, argparse.StoreConst(true), "", "Interpret endpoint_uri as the URI of a Fuseki dataset, and then use its query and update services as the corresponding endpoints for the session.") p.Option('d', "debug", "Debug", 0, argparse.StoreConst(true), "", "Show debug info.") args := &Args{} err := p.Parse(args) if err != nil { if cmdLineErr, ok := err.(argparse.CommandLineError); ok { ansi.Fprintln(os.Stderr, ansi.RedBold, string(cmdLineErr)) p.Help() os.Exit(2) } else { die(err, true) } } var queryService, updateService sparql.SparqlService if args.UseFuseki { dataset := fuseki.NewDataset(args.Endpoint) queryService = dataset.QueryService() updateService = dataset.UpdateService() } else { queryService = sparql.NewSparqlService(args.Endpoint) if args.UpdateEndpoint != "" { updateService = sparql.NewSparqlService(args.UpdateEndpoint) } else { updateService = queryService } } queryService.Debug = args.Debug updateService.Debug = args.Debug stdinReader := bufio.NewReader(os.Stdin) prefixes := make(map[string]string) // Prefix -> Base URI format := argo.Formats["rdfxml"] mainloop: for { fmt.Print("> ") line, err := stdinReader.ReadString('\n') if err == io.EOF { return } if die(err, false) { continue mainloop } line = trimPrefixes(line[:len(line)-1], prefixes) line = strings.Trim(line, " \r\n\t") if line == "" { continue mainloop } verb := line spacePos := strings.IndexRune(line, ' ') if spacePos >= 0 { verb = line[:spacePos] } switch strings.ToUpper(verb) { case "SELECT": rp, err := queryService.Select(line) if die(err, false) { continue mainloop } vars := rp.Vars() var table Table table.SetHeader(vars...) for result := range rp.ResultChan() { fields := make([]string, len(vars)) for i, v := range vars { fields[i] = result[v].String() } table.AddRow(fields...) } ansi.AttrOn(ansi.Yellow) table.Print() ansi.AttrOff(ansi.Yellow) case "ASK": result, err := queryService.Ask(line) if die(err, false) { continue mainloop } ansi.Printf(ansi.Magenta, "Result: %t\n", result) case "CONSTRUCT", "DESCRIBE": graph, err := queryService.Graph(line) if die(err, false) { continue mainloop } updateRev(graph.Prefixes, prefixes) ansi.AttrOn(ansi.Cyan) graph.Serialize(format.Serializer, os.Stdout) ansi.AttrOff(ansi.Cyan) case "INSERT", "DELETE", "LOAD", "CLEAR", "CREATE", "DROP", "COPY", "MOVE", "ADD": err := updateService.Update(line) if die(err, false) { continue mainloop } ansi.Println(ansi.GreenBold, "OK") case "FORMAT": formatName := strings.ToLower(line[spacePos+1:]) newFormat, ok := argo.Formats[formatName] if !ok { ansi.Fprintf(os.Stderr, ansi.RedBold, "Invalid format: %s\n", formatName) } format = newFormat default: ansi.Fprintf(os.Stderr, ansi.RedBold, "Invalid command: %s\n", verb) } } }