mirror of
https://github.com/nestriness/cli.git
synced 2025-12-11 11:55:35 +02:00
91 lines
3.0 KiB
Go
91 lines
3.0 KiB
Go
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"runtime"
|
|
|
|
"github.com/spf13/cobra"
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
// this is the "nestri run" subcommand, takes no arguments for now
|
|
var runCmd = &cobra.Command{
|
|
Use: "run",
|
|
Short: "Run a game using nestri",
|
|
Args: cobra.MinimumNArgs(1),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
if runtime.GOOS != "linux" {
|
|
//make sure os is linux
|
|
fmt.Println("This command is only supported on Linux.")
|
|
return nil
|
|
}
|
|
|
|
//The main job here is to:
|
|
//1. look for an exe in a certain directory,
|
|
//2. mount the directory inside the container
|
|
//3. Run the nestri docker container
|
|
//4. SSH into the container and set up everything
|
|
//5. Run the game
|
|
//6. Provide the URL to play or throw an error otherwise.
|
|
|
|
// The last argument is the game to run
|
|
game := args[len(args)-1]
|
|
|
|
// Load game configuration
|
|
var gameConfig GameConfig
|
|
if err := viper.UnmarshalKey(fmt.Sprintf("games.%s", game), &gameConfig); err != nil {
|
|
return fmt.Errorf("error parsing game configuration: %w", err)
|
|
}
|
|
|
|
flags := cmd.Flags()
|
|
|
|
if flags.Changed("directory") || flags.Changed("d") {
|
|
gameConfig.Directory, _ = flags.GetString("directory")
|
|
}
|
|
if flags.Changed("executable") || flags.Changed("x") {
|
|
gameConfig.Executable, _ = flags.GetString("executable")
|
|
}
|
|
if flags.Changed("gpu") {
|
|
gameConfig.GPU, _ = flags.GetInt("gpu")
|
|
}
|
|
if flags.Changed("vendor") || flags.Changed("v") {
|
|
gameConfig.Vendor, _ = flags.GetString("vendor")
|
|
}
|
|
if flags.Changed("height") || flags.Changed("H") {
|
|
gameConfig.Resolution.Height, _ = flags.GetInt("height")
|
|
}
|
|
if flags.Changed("width") || flags.Changed("W") {
|
|
gameConfig.Resolution.Width, _ = flags.GetInt("width")
|
|
}
|
|
|
|
fmt.Println("Game config:", gameConfig)
|
|
|
|
return nil
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
rootCmd.AddCommand(runCmd)
|
|
|
|
runCmd.Flags().StringP("directory", "d", "", "Game directory")
|
|
runCmd.Flags().StringP("executable", "x", "", "Game executable")
|
|
runCmd.Flags().Int("gpu", 0, "GPU number")
|
|
runCmd.Flags().StringP("vendor", "v", "", "GPU vendor")
|
|
runCmd.Flags().IntP("height", "H", 1080, "Screen height")
|
|
runCmd.Flags().IntP("width", "W", 1920, "Screen width")
|
|
|
|
// viper.BindPFlag("directory", runCmd.Flags().Lookup("directory"))
|
|
// viper.BindPFlag("executable", runCmd.Flags().Lookup("executable"))
|
|
// viper.BindPFlag("gpu", runCmd.Flags().Lookup("gpu"))
|
|
// viper.BindPFlag("vendor", runCmd.Flags().Lookup("vendor"))
|
|
// viper.BindPFlag("resolution.height", runCmd.Flags().Lookup("height"))
|
|
// viper.BindPFlag("resolution.width", runCmd.Flags().Lookup("width"))
|
|
|
|
viper.BindPFlag("games.*.directory", runCmd.Flags().Lookup("directory"))
|
|
viper.BindPFlag("games.*.executable", runCmd.Flags().Lookup("executable"))
|
|
viper.BindPFlag("games.*.gpu", runCmd.Flags().Lookup("gpu"))
|
|
viper.BindPFlag("games.*.vendor", runCmd.Flags().Lookup("vendor"))
|
|
viper.BindPFlag("games.*.resolution.height", runCmd.Flags().Lookup("height"))
|
|
viper.BindPFlag("games.*.resolution.width", runCmd.Flags().Lookup("width"))
|
|
}
|