package main import ( _ "embed" "flag" "fmt" "os" "strings" "github.com/Unbewohnte/ftu/receiver" "github.com/Unbewohnte/ftu/sender" ) // flags var ( PORT *int = flag.Int("port", 8080, "Specifies a port for a sender|port to connect to") SENDERADDR *string = flag.String("addr", "", "Specifies an address to connect to") DOWNLOADSFOLDER *string = flag.String("downloadto", ".", "Specifies where the receiver will store downloaded file") SHAREDFILE *string = flag.String("sharefile", "", "Specifies what file sender will send") LICENSE *bool = flag.Bool("license", false, "Prints a license text") SENDING bool //go:embed LICENSE LicenseText string ) // Input-validation func validateFlags() { if *LICENSE { fmt.Println(LicenseText) os.Exit(0) } // port validation if *PORT < 0 { fmt.Println("Invalid port !") os.Exit(-1) } // sending or receiving if strings.TrimSpace(*SHAREDFILE) != "" { SENDING = true } else if strings.TrimSpace(*SENDERADDR) != "" { SENDING = false } // check for default values in vital flags in case they were not provided if strings.TrimSpace(*SENDERADDR) == "" && strings.TrimSpace(*SHAREDFILE) == "" { flag.PrintDefaults() os.Exit(-1) } else if !SENDING && strings.TrimSpace(*SENDERADDR) == "" { fmt.Println("No specified sender`s address") os.Exit(-1) } else if SENDING && strings.TrimSpace(*SHAREDFILE) == "" { fmt.Println("No specified file") os.Exit(-1) } } // parse flags, validate given values func init() { flag.Parse() validateFlags() } func main() { if SENDING { // 1) create sender -> 2) wait for a connection ->| // 3) send info about the file -> 4) if accepted - upload file sender := sender.NewSender(*PORT, *SHAREDFILE) sender.WaitForConnection() sender.HandleInterrupt() sender.MainLoop() } else { // 1) create receiver -> 2) try to connect to a sender -> 3) wait for an info on the file ->| // 4) accept or refuse -> 5) download|don`t_download file receiver := receiver.NewReceiver(*DOWNLOADSFOLDER) receiver.Connect(fmt.Sprintf("%s:%d", *SENDERADDR, *PORT)) receiver.HandleInterrupt() receiver.MainLoop() } }