/// <summary> /// Read a metadata document. /// This method reads the metadata document from the input and returns /// an <see cref="IEdmModel"/> that represents the read metadata document. /// </summary> /// <param name="csdlReaderSettings">The given CSDL reader settings.</param> /// <returns>An <see cref="IEdmModel"/> representing the read metadata document.</returns> internal override IEdmModel ReadMetadataDocument(CsdlReaderSettingsBase csdlReaderSettings) { // Be noted: If the input setting is not JSON CSDL setting, let's use the default setting. CsdlJsonReaderSettings settings = csdlReaderSettings as CsdlJsonReaderSettings; CsdlJsonReaderSettings setting = settings ?? CsdlJsonReaderSettings.Default; // We can't use stream.Read(Span<byte> buffer), this method is introduced since .NET Core 2.1. :( byte[] bytes = this.messageStream.ReadAllBytes(); ReadOnlySpan <byte> jsonReadOnlySpan = new ReadOnlySpan <byte>(bytes); Utf8JsonReader jsonReader = new Utf8JsonReader(jsonReadOnlySpan); IEdmModel model; IEnumerable <EdmError> errors; if (!CsdlReader.TryParse(ref jsonReader, setting, out model, out errors)) { Debug.Assert(errors != null, "errors != null"); StringBuilder builder = new StringBuilder(); foreach (EdmError error in errors) { builder.AppendLine(error.ToString()); } throw new ODataException(Strings.ODataMetadataInputContext_ErrorReadingMetadata(builder.ToString())); } Debug.Assert(model != null, "model != null"); return(model); }
/// <summary> /// Initializes a new instance of <see cref="JsonParserContext"/> class. /// </summary> /// <param name="settings">The CSDL-JSON reader settings.</param> /// <param name="source">The parsing source.</param> public JsonParserContext(CsdlJsonReaderSettings settings = null, string source = null) { Source = source; Settings = settings ?? CsdlJsonReaderSettings.Default; _nodes = new Stack <object>(); Errors = new List <EdmError>(); _dirty = true; }