public static string SoftwareSpecification(this IUrlHelper urlHelper, SoftwareSpecification softwareSpecification) { var url = $"/requirements/{softwareSpecification.NumberFullyQualified}"; if (urlHelper == null) { return(url); } return(urlHelper.Content($"~{url}")); }
public SoftwareSpecification ParseSoftwareSpecification(string content) { var yaml = _yamlParser.ParseYaml(content); if (yaml.Yaml == null) { yaml = new YamlParseResult(Newtonsoft.Json.JsonConvert.DeserializeObject("{}"), yaml.Markdown); } StringBuilder requirement = new StringBuilder(); StringBuilder verification = new StringBuilder(); StringBuilder current = null; using (var stringReader = new StringReader(yaml.Markdown)) { string line; while ((line = stringReader.ReadLine()) != null) { if (line == "# Requirement") { current = requirement; } else if (line == "# Verification Method") { current = verification; } else { if (current == null) { throw new DocGenException($"Content '{line}' should be within a requirement or verification method"); } current.AppendLine(line); } } } var result = new SoftwareSpecification(); string number = yaml.Yaml?.Number; if (string.IsNullOrEmpty(number)) { throw new DocGenException("You must provider a number"); } if (!TryParseVersion(number, out Version version)) { throw new DocGenException($"Invalid number format {number}"); } result.Number = version; result.Title = yaml.Yaml?.Title; result.Requirement = requirement.ToString(); result.VerificationMethod = verification.ToString(); result.Requirement = result.Requirement.TrimEnd(Environment.NewLine.ToCharArray()); result.VerificationMethod = result.VerificationMethod.TrimEnd(Environment.NewLine.ToCharArray()); if (string.IsNullOrEmpty(result.Title)) { throw new DocGenException("Title is required"); } if (string.IsNullOrEmpty(result.Requirement)) { throw new DocGenException("Requirement is required"); } if (string.IsNullOrEmpty(result.VerificationMethod)) { throw new DocGenException("You must provide a verification method"); } return(result); }