Improve some adapters syntax

This commit is contained in:
Shinokuni 2021-04-14 17:58:33 +02:00
parent d6f98b0d08
commit fa7b7346cd
5 changed files with 80 additions and 90 deletions

View File

@ -15,23 +15,20 @@ interface XmlAdapter<T> {
fun fromXml(inputStream: InputStream): T fun fromXml(inputStream: InputStream): T
companion object { companion object {
fun xmlFeedAdapterFactory(type: LocalRSSHelper.RSSType): XmlAdapter<Feed> { fun xmlFeedAdapterFactory(type: LocalRSSHelper.RSSType): XmlAdapter<Feed> = when (type) {
return when (type) {
LocalRSSHelper.RSSType.RSS_1 -> RSS1FeedAdapter() LocalRSSHelper.RSSType.RSS_1 -> RSS1FeedAdapter()
LocalRSSHelper.RSSType.RSS_2 -> RSS2FeedAdapter() LocalRSSHelper.RSSType.RSS_2 -> RSS2FeedAdapter()
LocalRSSHelper.RSSType.ATOM -> ATOMFeedAdapter() LocalRSSHelper.RSSType.ATOM -> ATOMFeedAdapter()
else -> throw IllegalArgumentException("Unknown RSS type : $type") else -> throw IllegalArgumentException("Unknown RSS type : $type")
} }
}
fun xmlItemsAdapterFactory(type: LocalRSSHelper.RSSType): XmlAdapter<List<Item>> { fun xmlItemsAdapterFactory(type: LocalRSSHelper.RSSType): XmlAdapter<List<Item>> =
return when (type) { when (type) {
LocalRSSHelper.RSSType.RSS_1 -> RSS1ItemsAdapter() LocalRSSHelper.RSSType.RSS_1 -> RSS1ItemsAdapter()
LocalRSSHelper.RSSType.RSS_2 -> RSS2ItemsAdapter() LocalRSSHelper.RSSType.RSS_2 -> RSS2ItemsAdapter()
LocalRSSHelper.RSSType.ATOM -> ATOMItemsAdapter() LocalRSSHelper.RSSType.ATOM -> ATOMItemsAdapter()
else -> throw IllegalArgumentException("Unknown RSS type : $type") else -> throw IllegalArgumentException("Unknown RSS type : $type")
} }
}
const val AUTHORS_MAX = 4 const val AUTHORS_MAX = 4
} }

View File

@ -37,13 +37,13 @@ class ATOMFeedAdapter : XmlAdapter<Feed> {
} }
} }
private fun parseLink(konsume: Konsumer, feed: Feed) { private fun parseLink(konsume: Konsumer, feed: Feed) = with(konsume) {
val rel = konsume.attributes.getValueOpt("rel") val rel = attributes.getValueOpt("rel")
if (rel == "self") if (rel == "self")
feed.url = konsume.attributes["href"] feed.url = attributes["href"]
else if (rel == "alternate") else if (rel == "alternate")
feed.siteUrl = konsume.attributes["href"] feed.siteUrl = attributes["href"]
} }
companion object { companion object {

View File

@ -14,8 +14,7 @@ class JSONFeedAdapter {
fun toJson(feed: Feed) = "" fun toJson(feed: Feed) = ""
@FromJson @FromJson
fun fromJson(reader: JsonReader): Feed { fun fromJson(reader: JsonReader): Feed = try {
return try {
val feed = Feed() val feed = Feed()
reader.beginObject() reader.beginObject()
@ -36,7 +35,6 @@ class JSONFeedAdapter {
} catch (e: Exception) { } catch (e: Exception) {
throw ParseException(e.message) throw ParseException(e.message)
} }
}
companion object { companion object {
val names: JsonReader.Options = JsonReader.Options.of("title", "home_page_url", val names: JsonReader.Options = JsonReader.Options.of("title", "home_page_url",

View File

@ -17,8 +17,7 @@ class JSONItemsAdapter : JsonAdapter<List<Item>>() {
// not useful // not useful
} }
override fun fromJson(reader: JsonReader): List<Item> { override fun fromJson(reader: JsonReader): List<Item> = try {
return try {
val items = arrayListOf<Item>() val items = arrayListOf<Item>()
reader.beginObject() reader.beginObject()
@ -33,32 +32,31 @@ class JSONItemsAdapter : JsonAdapter<List<Item>>() {
} catch (e: Exception) { } catch (e: Exception) {
throw ParseException(e.message) throw ParseException(e.message)
} }
}
private fun parseItems(reader: JsonReader, items: MutableList<Item>) { private fun parseItems(reader: JsonReader, items: MutableList<Item>) = with(reader) {
reader.beginArray() beginArray()
while (reader.hasNext()) { while (hasNext()) {
reader.beginObject() beginObject()
val item = Item() val item = Item()
var contentText: String? = null var contentText: String? = null
var contentHtml: String? = null var contentHtml: String? = null
while (reader.hasNext()) { while (hasNext()) {
with(item) { with(item) {
when (reader.selectName(names)) { when (selectName(names)) {
0 -> guid = reader.nextNonEmptyString() 0 -> guid = nextNonEmptyString()
1 -> link = reader.nextNonEmptyString() 1 -> link = nextNonEmptyString()
2 -> title = reader.nextNonEmptyString() 2 -> title = nextNonEmptyString()
3 -> contentHtml = reader.nextNullableString() 3 -> contentHtml = nextNullableString()
4 -> contentText = reader.nextNullableString() 4 -> contentText = nextNullableString()
5 -> description = reader.nextNullableString() 5 -> description = nextNullableString()
6 -> imageLink = reader.nextNullableString() 6 -> imageLink = nextNullableString()
7 -> pubDate = DateUtils.parse(reader.nextNullableString()) 7 -> pubDate = DateUtils.parse(nextNullableString())
8 -> author = parseAuthor(reader) // jsonfeed 1.0 8 -> author = parseAuthor(reader) // jsonfeed 1.0
9 -> author = parseAuthors(reader) // jsonfeed 1.1 9 -> author = parseAuthors(reader) // jsonfeed 1.1
else -> reader.skipValue() else -> skipValue()
} }
} }
} }
@ -67,11 +65,11 @@ class JSONItemsAdapter : JsonAdapter<List<Item>>() {
item.content = if (contentHtml != null) contentHtml else contentText item.content = if (contentHtml != null) contentHtml else contentText
if (item.pubDate == null) item.pubDate = LocalDateTime.now() if (item.pubDate == null) item.pubDate = LocalDateTime.now()
reader.endObject() endObject()
items += item items += item
} }
reader.endArray() endArray()
} }
private fun parseAuthor(reader: JsonReader): String? { private fun parseAuthor(reader: JsonReader): String? {
@ -94,7 +92,7 @@ class JSONItemsAdapter : JsonAdapter<List<Item>>() {
reader.beginArray() reader.beginArray()
while (reader.hasNext()) { while (reader.hasNext()) {
authors.add(parseAuthor(reader)) authors += parseAuthor(reader)
} }
reader.endArray() reader.endArray()
@ -103,11 +101,10 @@ class JSONItemsAdapter : JsonAdapter<List<Item>>() {
authors.filterNotNull().joinToString(limit = AUTHORS_MAX) else null authors.filterNotNull().joinToString(limit = AUTHORS_MAX) else null
} }
private fun validateItem(item: Item) { private fun validateItem(item: Item): Boolean = when {
when {
item.title == null -> throw ParseException("Item title is required") item.title == null -> throw ParseException("Item title is required")
item.link == null -> throw ParseException("Item link is required") item.link == null -> throw ParseException("Item link is required")
} else -> true
} }
companion object { companion object {

View File

@ -58,10 +58,10 @@ class RSS2ItemsAdapter : XmlAdapter<List<Item>> {
} }
} }
private fun parseEnclosure(konsumer: Konsumer, item: Item) { private fun parseEnclosure(konsumer: Konsumer, item: Item) = with(konsumer) {
if (konsumer.attributes.getValueOpt("type") != null if (attributes.getValueOpt("type") != null
&& ApiUtils.isMimeImage(konsumer.attributes["type"]) && item.imageLink == null) && ApiUtils.isMimeImage(attributes["type"]) && item.imageLink == null)
item.imageLink = konsumer.attributes.getValueOpt("url") item.imageLink = attributes.getValueOpt("url")
} }
private fun isMediumImage(konsumer: Konsumer) = with(konsumer) { private fun isMediumImage(konsumer: Konsumer) = with(konsumer) {
@ -88,8 +88,7 @@ class RSS2ItemsAdapter : XmlAdapter<List<Item>> {
} }
} }
private fun finalizeItem(item: Item, creators: List<String?>) { private fun finalizeItem(item: Item, creators: List<String?>) = with(item) {
item.apply {
validateItem(this) validateItem(this)
if (pubDate == null) pubDate = LocalDateTime.now() if (pubDate == null) pubDate = LocalDateTime.now()
@ -97,7 +96,6 @@ class RSS2ItemsAdapter : XmlAdapter<List<Item>> {
if (author == null && creators.filterNotNull().isNotEmpty()) if (author == null && creators.filterNotNull().isNotEmpty())
author = creators.filterNotNull().joinToString(limit = AUTHORS_MAX) author = creators.filterNotNull().joinToString(limit = AUTHORS_MAX)
} }
}
private fun validateItem(item: Item) { private fun validateItem(item: Item) {
when { when {