public XElement Element { get; }
+ public bool IsTombstone
+ => this.tombstoneElm != null;
+
+ private readonly XElement? tombstoneElm;
+
public TimelineTweet(XElement element)
{
var typeName = element.Element("itemType")?.Value;
throw new ArgumentException($"Invalid itemType: {typeName}", nameof(element));
this.Element = element;
+ this.tombstoneElm = this.TryGetTombstoneElm();
}
+ private XElement? TryGetTombstoneElm()
+ => this.Element.XPathSelectElement("tweet_results/result[__typename[text()='TweetTombstone']]");
+
public TwitterStatus ToTwitterStatus()
{
+ this.ThrowIfTweetIsTombstone();
+
try
{
var resultElm = this.Element.Element("tweet_results")?.Element("result") ?? throw CreateParseError();
}
}
+ public void ThrowIfTweetIsTombstone()
+ {
+ if (this.tombstoneElm == null)
+ return;
+
+ var tombstoneText = this.tombstoneElm.XPathSelectElement("tombstone/text/text")?.Value;
+ var message = tombstoneText ?? "Tweet is not available";
+ var json = JsonUtils.JsonXmlToString(this.Element);
+
+ throw new WebApiException(message, json);
+ }
+
public static TwitterStatus ParseTweetUnion(XElement tweetUnionElm)
{
var tweetElm = tweetUnionElm.Element("__typename")?.Value switch