/// <summary> /// Parses <see cref="SessionUpdate"/> from JSON. /// </summary> public static SessionUpdate FromJson(JsonElement json) { var id = json.GetProperty("sid").GetStringOrThrow().Pipe(SentryId.Parse); var distinctId = json.GetPropertyOrNull("did")?.GetString(); var startTimestamp = json.GetProperty("started").GetDateTimeOffset(); var release = json.GetProperty("attrs").GetProperty("release").GetStringOrThrow(); var environment = json.GetProperty("attrs").GetPropertyOrNull("environment")?.GetString(); var ipAddress = json.GetProperty("attrs").GetPropertyOrNull("ip_address")?.GetString(); var userAgent = json.GetProperty("attrs").GetPropertyOrNull("user_agent")?.GetString(); var errorCount = json.GetPropertyOrNull("errors")?.GetInt32() ?? 0; var isInitial = json.GetPropertyOrNull("init")?.GetBoolean() ?? false; var timestamp = json.GetProperty("timestamp").GetDateTimeOffset(); var sequenceNumber = json.GetProperty("seq").GetInt32(); var endStatus = json.GetPropertyOrNull("status")?.GetString()?.ParseEnum <SessionEndStatus>(); return(new SessionUpdate( id, distinctId, startTimestamp, release, environment, ipAddress, userAgent, errorCount, isInitial, timestamp, sequenceNumber, endStatus)); }
/// <summary> /// Parses from JSON. /// </summary> public static Browser FromJson(JsonElement json) { var name = json.GetPropertyOrNull("name")?.GetString(); var version = json.GetPropertyOrNull("version")?.GetString(); return(new Browser { Name = name, Version = version }); }
/// <summary> /// Parses from JSON. /// </summary> public static UserFeedback FromJson(JsonElement json) { var eventId = json.GetPropertyOrNull("event_id")?.Pipe(SentryId.FromJson) ?? SentryId.Empty; var name = json.GetPropertyOrNull("name")?.GetString(); var email = json.GetPropertyOrNull("email")?.GetString(); var comments = json.GetPropertyOrNull("comments")?.GetString(); return(new UserFeedback(eventId, name, email, comments)); }
/// <summary> /// Parses from JSON. /// </summary> public static Gpu FromJson(JsonElement json) { var name = json.GetPropertyOrNull("name")?.GetString(); var id = json.GetPropertyOrNull("id")?.GetInt32(); var vendorId = json.GetPropertyOrNull("vendor_id")?.GetString(); var vendorName = json.GetPropertyOrNull("vendor_name")?.GetString(); var memorySize = json.GetPropertyOrNull("memory_size")?.GetInt32(); var apiType = json.GetPropertyOrNull("api_type")?.GetString(); var multiThreadedRendering = json.GetPropertyOrNull("multi_threaded_rendering")?.GetBoolean(); var version = json.GetPropertyOrNull("version")?.GetString(); var npotSupport = json.GetPropertyOrNull("npot_support")?.GetString(); return(new Gpu { Name = name, Id = id, VendorId = vendorId, VendorName = vendorName, MemorySize = memorySize, ApiType = apiType, MultiThreadedRendering = multiThreadedRendering, Version = version, NpotSupport = npotSupport }); }
private static VideoInfo GetVideoInfo(JsonElement?element) { return(new() { ExtractedUrl = element?.GetPropertyOrNull("url")?.GetString(), ThumbnailUrl = element?.GetPropertyOrNull("thumbnail")?.GetString(), DurationSeconds = element?.GetPropertyOrNull("duration")?.GetDoubleOrNull(), Width = element?.GetPropertyOrNull("width")?.GetIntOrNull(), Height = element?.GetPropertyOrNull("height")?.GetIntOrNull() }); }
/// <summary> /// Parses from JSON. /// </summary> public static SentryMessage FromJson(JsonElement json) { var message = json.GetPropertyOrNull("message")?.GetString(); var @params = json.GetPropertyOrNull("params")?.EnumerateArray().Select(j => j.GetDynamic()).Where(o => o != null).ToArray(); var formatted = json.GetPropertyOrNull("formatted")?.GetString(); return(new SentryMessage { Message = message, Params = @params !, Formatted = formatted });
public string?TryGetVideoPlayabilityError() { return(_root .GetPropertyOrNull("playabilityStatus")? .GetPropertyOrNull("reason")? .GetString()); }
/// <summary> /// Parses from JSON. /// </summary> public static Runtime FromJson(JsonElement json) { var name = json.GetPropertyOrNull("name")?.GetString(); var version = json.GetPropertyOrNull("version")?.GetString(); var rawDescription = json.GetPropertyOrNull("raw_description")?.GetString(); var build = json.GetPropertyOrNull("build")?.GetString(); return(new Runtime { Name = name, Version = version, RawDescription = rawDescription, Build = build }); }
public static PersistedSessionUpdate FromJson(JsonElement json) { var update = SessionUpdate.FromJson(json.GetProperty("update")); var pauseTimestamp = json.GetPropertyOrNull("paused")?.GetDateTimeOffset(); return(new PersistedSessionUpdate(update, pauseTimestamp)); }
/// <summary> /// Parses from JSON. /// </summary> public static SentryThread FromJson(JsonElement json) { var id = json.GetPropertyOrNull("id")?.GetInt32(); var name = json.GetPropertyOrNull("name")?.GetString(); var crashed = json.GetPropertyOrNull("crashed")?.GetBoolean(); var current = json.GetPropertyOrNull("current")?.GetBoolean(); var stacktrace = json.GetPropertyOrNull("stacktrace")?.Pipe(SentryStackTrace.FromJson); return(new SentryThread { Id = id, Name = name, Crashed = crashed, Current = current, Stacktrace = stacktrace }); }
private static IReadOnlyDictionary <string, object?>?ParseExtensions(this JsonElement error) { if (error.GetPropertyOrNull("extensions") is { ValueKind : JsonValueKind.Object } ext) { return((IReadOnlyDictionary <string, object?>?)ParseValue(ext)); } return(null); }
/// <summary> /// Parses from JSON. /// </summary> public static SdkVersion FromJson(JsonElement json) { // Packages var packages = json.GetPropertyOrNull("packages")?.EnumerateArray().Select(Package.FromJson).ToArray() ?? Array.Empty <Package>(); // Name var name = json.GetPropertyOrNull("name")?.GetString() ?? "dotnet.unknown"; // Version var version = json.GetPropertyOrNull("version")?.GetString() ?? "0.0.0"; return(new SdkVersion { InternalPackages = new ConcurrentBag <Package>(packages), Name = name, Version = version }); }
private static IClientError ParseError(JsonElement error) { var message = error.GetPropertyOrNull("message")?.GetString(); if (message is null) { return(new ClientError(JsonErrorParser_ParseError_MessageCannotBeNull)); } IReadOnlyList <object>? path = error.ParsePath(); IReadOnlyList <Location>?locations = error.ParseLocations(); IReadOnlyDictionary <string, object?>?extensions = error.ParseExtensions(); var code = error.ParseCode(extensions); return(new ClientError(message, code, path, locations, extensions: extensions)); }
/// <summary> /// Parses from JSON. /// </summary> public static Breadcrumb FromJson(JsonElement json) { var timestamp = json.GetPropertyOrNull("timestamp")?.GetDateTimeOffset(); var message = json.GetPropertyOrNull("message")?.GetString(); var type = json.GetPropertyOrNull("type")?.GetString(); var data = json.GetPropertyOrNull("data")?.GetStringDictionaryOrNull(); var category = json.GetPropertyOrNull("category")?.GetString(); var level = json.GetPropertyOrNull("level")?.GetString()?.ParseEnum <BreadcrumbLevel>() ?? default; return(new Breadcrumb(timestamp, message, type, data !, category, level)); }
public static TEnum?GetEnumOrNull <TEnum>(this JsonElement json, string name) where TEnum : struct { var enumString = json.GetPropertyOrNull(name)?.ToString(); if (string.IsNullOrWhiteSpace(enumString)) { return(null); } if (!Enum.TryParse(enumString, true, out TEnum value)) { return(null); } return(value); }
/// <summary> /// Gets the <see cref="JsonElement"/> that represents a property that matches the specified path. /// /// Returns null if no matching property is found. /// </summary> /// <remarks>This currently supports only simple paths, e.g. 'prop1.prop2.prop3'.</remarks> public static JsonElement?GetPropertyByPathOrNull(this JsonElement element, string propertyPath) { var propertyNames = propertyPath.Split('.', StringSplitOptions.RemoveEmptyEntries); var currentElement = new JsonElement?(element); foreach (var propertyName in propertyNames) { currentElement = currentElement?.GetPropertyOrNull(propertyName); if (currentElement is null) { break; } } return(currentElement); }
private static IReadOnlyList <Location>?ParseLocations(this JsonElement error) { if (error.GetPropertyOrNull("locations") is { ValueKind : JsonValueKind.Array } locations) { var array = new Location[locations.GetArrayLength()]; var i = 0; foreach (JsonElement location in locations.EnumerateArray()) { array[i++] = new Location( location.GetProperty("line").GetInt32(), location.GetProperty("column").GetInt32()); } return(array); } return(null); }
/// <summary> /// Parses from JSON. /// </summary> public static Request FromJson(JsonElement json) { var env = json.GetPropertyOrNull("env")?.GetDictionary(); var other = json.GetPropertyOrNull("other")?.GetDictionary(); var headers = json.GetPropertyOrNull("headers")?.GetDictionary(); var url = json.GetPropertyOrNull("url")?.GetString(); var method = json.GetPropertyOrNull("method")?.GetString(); var data = json.GetPropertyOrNull("data")?.GetDynamic(); var query = json.GetPropertyOrNull("query_string")?.GetString(); var cookies = json.GetPropertyOrNull("cookies")?.GetString(); return(new Request { InternalEnv = env?.ToDictionary() !, InternalOther = other?.ToDictionary() !, InternalHeaders = headers?.ToDictionary() !, Url = url, Method = method, Data = data, QueryString = query, Cookies = cookies });
private static string?ParseCode( this JsonElement error, IReadOnlyDictionary <string, object?>?extensions) { // if we have a top level code property we will take this. // While this is not spec compliant with the 2018 spec many people still do this. if (error.GetPropertyOrNull("code") is { ValueKind : JsonValueKind.String } code) { return(code.GetString()); } // if we do not have a top level error code we will check if the extensions // dictionary has any field called code. if (extensions is not null && extensions.TryGetValue("code", out object?value) && value is string s) { return(s); } return(null); }
private static IReadOnlyList <object>?ParsePath(this JsonElement error) { if (error.GetPropertyOrNull("path") is { ValueKind : JsonValueKind.Array } path) { var array = new object[path.GetArrayLength()]; var i = 0; foreach (JsonElement element in path.EnumerateArray()) { array[i++] = element.ValueKind switch { JsonValueKind.String => element.GetString() !, JsonValueKind.Number => element.GetInt32(), _ => "NOT_SUPPORTED_VALUE" }; } return(array); } return(null); }
/// <summary> /// Parses from JSON. /// </summary> public static App FromJson(JsonElement json) { var identifier = json.GetPropertyOrNull("app_identifier")?.GetString(); var startTime = json.GetPropertyOrNull("app_start_time")?.GetDateTimeOffset(); var hash = json.GetPropertyOrNull("device_app_hash")?.GetString(); var buildType = json.GetPropertyOrNull("build_type")?.GetString(); var name = json.GetPropertyOrNull("app_name")?.GetString(); var version = json.GetPropertyOrNull("app_version")?.GetString(); var build = json.GetPropertyOrNull("app_build")?.GetString(); return(new App { Identifier = identifier, StartTime = startTime, Hash = hash, BuildType = buildType, Name = name, Version = version, Build = build }); }
/// <summary> /// Parses from JSON. /// </summary> public static Mechanism FromJson(JsonElement json) { var data = json.GetPropertyOrNull("data")?.GetObjectDictionary(); var meta = json.GetPropertyOrNull("meta")?.GetObjectDictionary(); var type = json.GetPropertyOrNull("type")?.GetString(); var description = json.GetPropertyOrNull("description")?.GetString(); var helpLink = json.GetPropertyOrNull("help_link")?.GetString(); var handled = json.GetPropertyOrNull("handled")?.GetBoolean(); return(new Mechanism { InternalData = data?.ToDictionary() !, InternalMeta = meta?.ToDictionary() !, Type = type, Description = description, HelpLink = helpLink, Handled = handled });
/// <summary> /// Parses from JSON. /// </summary> public static SentryException FromJson(JsonElement json) { var type = json.GetPropertyOrNull("type")?.GetString(); var value = json.GetPropertyOrNull("value")?.GetString(); var module = json.GetPropertyOrNull("module")?.GetString(); var threadId = json.GetPropertyOrNull("thread_id")?.GetInt32() ?? 0; var stacktrace = json.GetPropertyOrNull("stacktrace")?.Pipe(SentryStackTrace.FromJson); var mechanism = json.GetPropertyOrNull("mechanism")?.Pipe(Mechanism.FromJson); return(new SentryException { Type = type, Value = value, Module = module, ThreadId = threadId, Stacktrace = stacktrace, Mechanism = mechanism }); }
/// <summary> /// Parses from JSON. /// </summary> public static OperatingSystem FromJson(JsonElement json) { var name = json.GetPropertyOrNull("name")?.GetString(); var version = json.GetPropertyOrNull("version")?.GetString(); var rawDescription = json.GetPropertyOrNull("raw_description")?.GetString(); var build = json.GetPropertyOrNull("build")?.GetString(); var kernelVersion = json.GetPropertyOrNull("kernel_version")?.GetString(); var rooted = json.GetPropertyOrNull("rooted")?.GetBoolean(); return(new OperatingSystem { Name = name, Version = version, RawDescription = rawDescription, Build = build, KernelVersion = kernelVersion, Rooted = rooted }); }
/// <summary> /// Parses from JSON. /// </summary> public static Device FromJson(JsonElement json) { var timezone = json.GetPropertyOrNull("timezone")?.GetString()?.Pipe(TimeZoneInfo.FindSystemTimeZoneById); var name = json.GetPropertyOrNull("name")?.GetString(); var manufacturer = json.GetPropertyOrNull("manufacturer")?.GetString(); var brand = json.GetPropertyOrNull("brand")?.GetString(); var family = json.GetPropertyOrNull("family")?.GetString(); var model = json.GetPropertyOrNull("model")?.GetString(); var modelId = json.GetPropertyOrNull("model_id")?.GetString(); var architecture = json.GetPropertyOrNull("arch")?.GetString(); var batteryLevel = json.GetPropertyOrNull("battery_level")?.GetInt16(); var isCharging = json.GetPropertyOrNull("charging")?.GetBoolean(); var isOnline = json.GetPropertyOrNull("online")?.GetBoolean(); var orientation = json.GetPropertyOrNull("orientation")?.GetString()?.Pipe(s => s.ParseEnum <DeviceOrientation>()); var simulator = json.GetPropertyOrNull("simulator")?.GetBoolean(); var memorySize = json.GetPropertyOrNull("memory_size")?.GetInt64(); var freeMemory = json.GetPropertyOrNull("free_memory")?.GetInt64(); var usableMemory = json.GetPropertyOrNull("usable_memory")?.GetInt64(); var lowMemory = json.GetPropertyOrNull("low_memory")?.GetBoolean(); var storageSize = json.GetPropertyOrNull("storage_size")?.GetInt64(); var freeStorage = json.GetPropertyOrNull("free_storage")?.GetInt64(); var externalStorageSize = json.GetPropertyOrNull("external_storage_size")?.GetInt64(); var externalFreeStorage = json.GetPropertyOrNull("external_free_storage")?.GetInt64(); var screenResolution = json.GetPropertyOrNull("screen_resolution")?.GetString(); var screenDensity = json.GetPropertyOrNull("screen_density")?.GetSingle(); var screenDpi = json.GetPropertyOrNull("screen_dpi")?.GetInt32(); var bootTime = json.GetPropertyOrNull("boot_time")?.GetDateTimeOffset(); return(new Device { Timezone = timezone, Name = name, Manufacturer = manufacturer, Brand = brand, Family = family, Model = model, ModelId = modelId, Architecture = architecture, BatteryLevel = batteryLevel, IsCharging = isCharging, IsOnline = isOnline, Orientation = orientation, Simulator = simulator, MemorySize = memorySize, FreeMemory = freeMemory, UsableMemory = usableMemory, LowMemory = lowMemory, StorageSize = storageSize, FreeStorage = freeStorage, ExternalStorageSize = externalStorageSize, ExternalFreeStorage = externalFreeStorage, ScreenResolution = screenResolution, ScreenDensity = screenDensity, ScreenDpi = screenDpi, BootTime = bootTime }); }
public static string Flatten(this JsonElement element) => string.Concat( element .GetPropertyOrNull("runs")? .EnumerateArray() .Select(x => x.GetPropertyOrNull("text")?.GetString()) ?? Enumerable.Empty <string>() );
private static IEnumerable <Task <Feed?> > ParseFeedJson(JsonElement stacc) { var users = stacc.GetPropertyOrNull("user").EnumerateObjectOrEmpty(); var illusts = stacc.GetPropertyOrNull("illust").EnumerateObjectOrEmpty(); var novels = stacc.GetPropertyOrNull("novel").EnumerateObjectOrEmpty(); var statuses = stacc.GetPropertyOrNull("status").EnumerateObjectOrEmpty(); var timelines = stacc.GetPropertyOrNull("timeline").EnumerateObjectOrEmpty(); return(timelines.SelectNotNull(timeline => Task.Run(() => ParseFeed(timeline)))); Feed?ParseFeed(JsonProperty timeline) { var id = timeline.Name; var status = statuses.FirstOrNull(st => st.Name == id); if (!status.HasValue) { return(null); } FeedType?feedType = status.Value.GetPropertyString("type") switch { "add_bookmark" => FeedType.AddBookmark, "add_illust" => FeedType.AddIllust, "add_novel_bookmark" => FeedType.AddNovelBookmark, "add_favorite" => FeedType.AddFavorite, _ => null }; var feedTargetId = feedType switch { FeedType.AddBookmark or FeedType.AddIllust => status.Value.GetProperty("ref_illust").GetPropertyString("id"), FeedType.AddFavorite => status.Value.GetProperty("ref_user").GetPropertyLong("id").ToString(), // long & string in two objects with almost the same properties? f**k pixiv FeedType.AddNovelBookmark => status.Value.GetProperty("ref_novel").GetPropertyString("id"), _ => null }; if (feedTargetId is null) { return(null); // a feed with null target ID is considered useless because we cannot track its target } var feedTargetThumbnail = feedType switch { FeedType.AddBookmark or FeedType.AddIllust => illusts.FirstOrNull(i => i.Name == feedTargetId) ?.GetPropertyOrNull("url") ?.GetPropertyOrNull("m") ?.GetString(), FeedType.AddFavorite => users.FirstOrNull(u => u.Name == feedTargetId) ?.GetPropertyOrNull("profile_image") .EnumerateObjectOrEmpty() .FirstOrNull() ?.GetPropertyOrNull("url") ?.GetPropertyOrNull("m") ?.GetString(), FeedType.AddNovelBookmark => novels.FirstOrNull(n => n.Name == feedTargetId) ?.GetPropertyOrNull("url") ?.GetPropertyOrNull("m") ?.GetString(), _ => null }; var postDate = DateTime.ParseExact(status.Value.GetPropertyString("post_date") !, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture.DateTimeFormat, DateTimeStyles.AllowWhiteSpaces); var postUserId = status.Value.GetProperty("post_user").GetPropertyLong("id").ToString(); var postUser = users.FirstOrNull(u => u.Name == postUserId); if (!postUser.HasValue) { return(null); } var postUserName = postUser.Value.GetPropertyString("name"); var postUserThumbnail = postUser.Value .GetPropertyOrNull("profile_image") .EnumerateObjectOrEmpty() .FirstOrNull() ?.GetPropertyOrNull("url") ?.GetPropertyOrNull("m") ?.GetString(); var feedObject = new Feed { FeedId = feedTargetId, FeedThumbnail = feedTargetThumbnail, Type = feedType, PostDate = postDate, PostUserId = postUserId, PostUserName = postUserName, PostUserThumbnail = postUserThumbnail }; switch (feedType) { case FeedType.AddBookmark or FeedType.AddIllust: { var illustration = illusts.FirstOrNull(i => i.Name == feedTargetId); feedObject.ArtistName = users.FirstOrNull(u => u.Name == (illustration?.GetPropertyOrNull("post_user")?.GetPropertyOrNull("id")?.GetString() ?? string.Empty))?.GetPropertyOrNull("name")?.GetString(); feedObject.FeedName = illustration?.GetPropertyOrNull("title")?.GetString(); break; } case FeedType.AddFavorite: feedObject.FeedName = users.FirstOrNull(u => u.Name == feedTargetId)?.GetPropertyOrNull("name")?.GetString(); feedObject.IsTargetRefersToUser = true; break; } return(feedObject); } }
public string?TryGetAuthor() { return(_root .GetPropertyOrNull("author")? .GetString()); }
/// <summary> /// Parses from JSON. /// </summary> public static SentryStackFrame FromJson(JsonElement json) { var preContext = json.GetPropertyOrNull("pre_context")?.EnumerateArray().Select(j => j.GetString()).ToList(); var postContext = json.GetPropertyOrNull("post_context")?.EnumerateArray().Select(j => j.GetString()).ToList(); var vars = json.GetPropertyOrNull("vars")?.GetDictionary(); var framesOmitted = json.GetPropertyOrNull("frames_omitted")?.EnumerateArray().Select(j => j.GetInt32()).ToList(); var filename = json.GetPropertyOrNull("filename")?.GetString(); var function = json.GetPropertyOrNull("function")?.GetString(); var module = json.GetPropertyOrNull("module")?.GetString(); var lineNumber = json.GetPropertyOrNull("lineno")?.GetInt32(); var columnNumber = json.GetPropertyOrNull("colno")?.GetInt32(); var absolutePath = json.GetPropertyOrNull("abs_path")?.GetString(); var contextLine = json.GetPropertyOrNull("context_line")?.GetString(); var inApp = json.GetPropertyOrNull("in_app")?.GetBoolean(); var package = json.GetPropertyOrNull("package")?.GetString(); var platform = json.GetPropertyOrNull("platform")?.GetString(); var imageAddress = json.GetPropertyOrNull("image_addr")?.GetInt64() ?? 0; var symbolAddress = json.GetPropertyOrNull("symbol_addr")?.GetInt64(); var instructionAddress = json.GetPropertyOrNull("instruction_addr")?.GetString(); var instructionOffset = json.GetPropertyOrNull("instruction_offset")?.GetInt64(); return(new SentryStackFrame { InternalPreContext = preContext !, InternalPostContext = postContext !, InternalVars = vars?.ToDictionary() !, InternalFramesOmitted = framesOmitted, FileName = filename, Function = function, Module = module, LineNumber = lineNumber, ColumnNumber = columnNumber, AbsolutePath = absolutePath, ContextLine = contextLine, InApp = inApp, Package = package, Platform = platform, ImageAddress = imageAddress, SymbolAddress = symbolAddress, InstructionAddress = instructionAddress, InstructionOffset = instructionOffset });
public string GetUrl() { return(_root .GetPropertyOrNull("url")? .GetString() ?? _root .GetPropertyOrNull("cipher")? .GetString() .Pipe(Url.SplitQuery)["url"] ?? _root .GetProperty("signatureCipher") .GetString() .Pipe(Url.SplitQuery)["url"]); }