using YamlDotNet.Serialization; using YamlDotNet.Serialization.NamingConventions; namespace RobloxCS { public static class ConfigReader { public static ConfigData UnitTestingConfig { get { return new ConfigData() { SourceFolder = "test-src", OutputFolder = "test-dist", RojoProjectName = "UNIT_TESTING", EnabledBuiltInTransformers = ["Debug"], EmitNativeAttributeOnClassOrNamespaceCallbacks = true, CSharpOptions = new CSharpOptions() { EntryPointName = "UnitTest", MainMethodName = "Main", AssemblyName = "UnitTesting" } }; } } private const string _fileName = "roblox-cs.yml"; public static ConfigData Read(string inputDirectory) { var configPath = inputDirectory + "/" + _fileName; ConfigData? config = default; string ymlContent = default!; try { ymlContent = File.ReadAllText(configPath); } catch (Exception e) { FailToRead(e.Message); } var deserializer = new DeserializerBuilder() .WithNamingConvention(PascalCaseNamingConvention.Instance) .WithAttemptingUnquotedStringTypeDeserialization() .WithDuplicateKeyChecking() .Build(); try { config = deserializer.Deserialize(ymlContent); } catch (Exception e) { FailToRead(e.ToString()); } if (config == null || !config.IsValid()) { FailToRead("Invalid config! Make sure it has all required fields."); } return config!; } private static void FailToRead(string message) { Logger.Error($"Failed to read {_fileName}!\n{message}"); } } }