// ParseSpec parses the given specification and returns an opened handle to an // API Interface. The following formats are currently supported: // - http:// URL pointed at a JSON web API // - https:// URL pointed at a JSON web API // - host:port pointed at a GRPC API // - local path to a LevelDB serving table func ParseSpec(apiSpec string) (Interface, error) { api := &apiCloser{} if strings.HasPrefix(apiSpec, "http://") || strings.HasPrefix(apiSpec, "https://") { api.xs = xrefs.WebClient(apiSpec) api.ft = filetree.WebClient(apiSpec) } else if _, err := os.Stat(apiSpec); err == nil { db, err := leveldb.Open(apiSpec, nil) if err != nil { return nil, fmt.Errorf("error opening local DB at %q: %v", apiSpec, err) } api.closer = func() error { return db.Close() } tbl := table.ProtoBatchParallel{&table.KVProto{db}} api.xs = xsrv.NewCombinedTable(tbl) api.ft = &ftsrv.Table{tbl, true} } else { conn, err := grpc.Dial(apiSpec, grpc.WithInsecure()) if err != nil { return nil, fmt.Errorf("error connecting to remote API %q: %v", apiSpec, err) } api.closer = func() error { conn.Close(); return nil } api.xs = xrefs.GRPC(xpb.NewXRefServiceClient(conn), gpb.NewGraphServiceClient(conn)) api.ft = filetree.GRPC(ftpb.NewFileTreeServiceClient(conn)) } return api, nil }
func main() { flag.Parse() if len(flag.Args()) == 0 { flag.Usage() os.Exit(0) } else if *servingTable == "" && *remoteAPI == "" { log.Fatal("One of --serving_table or --api is required") } if *servingTable == "" { if strings.HasPrefix(*remoteAPI, "http://") || strings.HasPrefix(*remoteAPI, "https://") { xs = xrefs.WebClient(*remoteAPI) ft = filetree.WebClient(*remoteAPI) idx = search.WebClient(*remoteAPI) } else { conn, err := grpc.Dial(*remoteAPI) if err != nil { log.Fatalf("Error connecting to remote API %q: %v", *remoteAPI, err) } defer conn.Close() xs = xrefs.GRPC(xpb.NewXRefServiceClient(conn)) ft = filetree.GRPC(ftpb.NewFileTreeServiceClient(conn)) idx = search.GRPC(spb.NewSearchServiceClient(conn)) } } else { db, err := leveldb.Open(*servingTable, nil) if err != nil { log.Fatalf("Error opening db at %q: %v", *servingTable, err) } defer db.Close() tbl := &table.KVProto{db} xs = &xsrv.Table{tbl} ft = &ftsrv.Table{tbl} idx = &srchsrv.Table{&table.KVInverted{db}} } if err := getCommand(flag.Arg(0)).run(); err != nil { log.Fatal("ERROR: ", err) } }