public GameInstance TryAddServer(GameInstance newServer)
        {
            string newId = _slug.GenerateSlug(newServer.Name);

            // verify uniqueness of slug
            if (IdExists(newId))
            {
                return null;
            }

            DirectoryInfo newDirectory = _baseDirectory.CreateSubdirectory(newId);

            // Create server-info.json
            using (StreamWriter w = new StreamWriter(Path.Combine(newDirectory.FullName, SERVER_INFO_FILE_NAME)))
            {
                ServerInfoFile sInfo = new ServerInfoFile()
                {
                    Name = newServer.Name,
                    Description = newServer.Description,
                    MajorVersion = newServer.TargetVersion.Major,
                    MinorVersion = newServer.TargetVersion.Minor,
                    PatchVersion = newServer.TargetVersion.Patch
                };
                w.Write(JsonConvert.SerializeObject(sInfo));
            }
            // TODO -create folders structure

            // Just reload, ignore the performance hit
            return GetById(newId); ;
        }
        public GameInstance UpdateServer(GameInstance value)
        {
            // TODO - write to file system and update environments
            DirectoryInfo d = GetServerDirectory(value.Key);

            if (!d.Exists)
            {
                // TODO - Error
                return null;
            }

            using (StreamWriter w = new StreamWriter(Path.Combine(d.FullName, SERVER_INFO_FILE_NAME)))
            {
                ServerInfoFile sInfo = new ServerInfoFile()
                {
                    Name = value.Name,
                    Description = value.Description,
                    MajorVersion = value.TargetVersion.Major,
                    MinorVersion = value.TargetVersion.Minor,
                    PatchVersion = value.TargetVersion.Patch,
                    Mods = value.Mods
                };
                w.Write(JsonConvert.SerializeObject(sInfo));
            }

            return GetById(value.Key);
        }
        private GameInstance GetServerInstanceFromFile(DirectoryInfo d)
        {
            FileInfo[] file = d.GetFiles(SERVER_INFO_FILE_NAME);
            if (file.Length != 1)
                return null;

            FileInfo serverInfoFile = file[0];
            using (StreamReader r = new StreamReader(serverInfoFile.FullName))
            {
                ServerInfoFile sInfo = JsonConvert.DeserializeObject<ServerInfoFile>(r.ReadToEnd());
                if (sInfo == null) return null;

                return new GameInstance
                {
                    Key = serverInfoFile.Directory.Name,
                    Name = sInfo.Name,
                    Description = sInfo.Description,
                    TargetVersion = new FuzzyVersion
                    {
                        Major = sInfo.MajorVersion.GetValueOrDefault(0),
                        Minor = sInfo.MinorVersion.GetValueOrDefault(17),
                        Patch = sInfo.PatchVersion
                    },
                    Mods = sInfo.Mods,
                    ImplementationInfo = GetImplementationInfo(serverInfoFile.Directory.Name)
                };
            }
        }