public static ParsingContext Parse(Stream stream) { RootNode rootNode; var context = new ParsingContext(); try { var yamlStream = new YamlStream(); yamlStream.Load(new StreamReader(stream)); var yamlDocument = yamlStream.Documents.First(); rootNode = new RootNode(context, yamlDocument); } catch (SharpYaml.SyntaxErrorException ex) { context.ParseErrors.Add(new OpenApiError("", ex.Message)); context.OpenApiDocument = new OpenApiDocument(); // Could leave this null? return(context); } var inputVersion = GetVersion(rootNode); switch (inputVersion) { case "2.0": context.SetReferenceService(new ReferenceService(rootNode) { loadReference = OpenApiV2Reader.LoadReference, parseReference = p => OpenApiV2Reader.ParseReference(p) }); context.OpenApiDocument = OpenApiV2Reader.LoadOpenApi(rootNode); break; default: context.SetReferenceService(new ReferenceService(rootNode) { loadReference = OpenApiV3Reader.LoadReference, parseReference = p => new OpenApiReference(p) }); context.OpenApiDocument = OpenApiV3Reader.LoadOpenApi(rootNode); break; } return(context); }
public static IReference LoadReference(OpenApiReference pointer, RootNode rootNode) { IReference referencedObject = null; var node = rootNode.Find(pointer.GetLocalPointer()); if (node == null && pointer.ReferenceType != ReferenceType.Tags) { return(null); } switch (pointer.ReferenceType) { case ReferenceType.Schema: referencedObject = OpenApiV3Reader.LoadSchema(node); break; case ReferenceType.Parameter: referencedObject = OpenApiV3Reader.LoadParameter(node); break; case ReferenceType.Callback: referencedObject = OpenApiV3Reader.LoadCallback(node); break; case ReferenceType.SecurityScheme: referencedObject = OpenApiV3Reader.LoadSecurityScheme(node); break; case ReferenceType.Link: referencedObject = OpenApiV3Reader.LoadLink(node); break; case ReferenceType.Example: referencedObject = OpenApiV3Reader.LoadExample(node); break; case ReferenceType.Tags: ListNode list = (ListNode)node; if (list != null) { foreach (var item in list) { var tag = OpenApiV3Reader.LoadTag(item); if (tag.Name == pointer.TypeName) { return(tag); } } } else { return(new Tag() { Name = pointer.TypeName }); } break; default: throw new DomainParseException($"Unknown type of $ref {pointer.ReferenceType} at {pointer.ToString()}"); } return(referencedObject); }