Build Logs

swaldman/feedletter • 3.8.0-RC4:2025-12-22

Errors

0

Warnings

872

Total Lines

989

1##################################
2Clonning https://github.com/swaldman/feedletter.git into /build/repo using revision v0.1.8
3##################################
4Note: switching to '03c3d9d81cf96275a2f1413ecbdf0bd387cec019'.
5
6You are in 'detached HEAD' state. You can look around, make experimental
7changes and commit them, and you can discard any commits you make in this
8state without impacting any branches by switching back to a branch.
9
10If you want to create a new branch to retain commits you create, you may
11do so (now or later) by using -c with the switch command. Example:
12
13 git switch -c <new-branch-name>
14
15Or undo this operation with:
16
17 git switch -
18
19Turn off this advice by setting config variable advice.detachedHead to false
20
21----
22Preparing build for 3.8.0-RC4
23Scala binary version found: 3.8
24Implicitly using source version 3.8
25Scala binary version found: 3.8
26Implicitly using source version 3.8
27Would try to apply common scalacOption (best-effort, sbt/mill only):
28Append: ,REQUIRE:-source:3.8
29Remove: ,-deprecation,-feature,-Xfatal-warnings,-Werror,MATCH:.*-Wconf.*any:e
30----
31Starting build for 3.8.0-RC4
32Execute tests: true
33Mill project found:
34Found explicit mill version 0.12.14 in build directive
35Force upgrade of millVersion 0.12.14 to 0.12.16
36Detected mill version=0.12.16, binary version: 0.12
37No prepare script found for project swaldman/feedletter
38No mill build directory found
39Apply scalafix rules to build.mill
40##################################
41Scala version: 3.8.0-RC4
42Targets: com.mchange%feedletter
43Project projectConfig: {"tests":null}
44##################################
45Downloading mill 0.12.16 from https://repo1.maven.org/maven2/com/lihaoyi/mill-dist/0.12.16/mill-dist-0.12.16.exe ...
46 % Total % Received % Xferd Average Speed Time Time Time Current
47 Dload Upload Total Spent Left Speed
48
49 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
50 5 72.6M 5 4350k 0 0 15.1M 0 0:00:04 --:--:-- 0:00:04 15.1M
51100 72.6M 100 72.6M 0 0 77.9M 0 --:--:-- --:--:-- --:--:-- 77.9M
52============================== resolve _ ==============================
53[mill-build/build.sc-61/65] compile
54[mill-build/build.sc-61] [info] compiling 1 Scala source to /build/repo/out/mill-build/mill-build/compile.dest/classes ...
55[mill-build/build.sc-61] [info] done compiling
56[build.sc-62/66] compile
57[build.sc-62] [info] compiling 4 Scala sources to /build/repo/out/mill-build/compile.dest/classes ...
58[build.sc-62] [warn] /build/repo/CommunityBuildCore.mill:136:22: object JavaConverters in package collection is deprecated (since 2.13.0): Use `scala.jdk.CollectionConverters` instead
59[build.sc-62] [warn] .iterator()
60[build.sc-62] [warn] ^
61[build.sc-62] [warn] /build/repo/MillCommunityBuild.mill:222:14: object millInternal in trait Module is deprecated (since Mill 0.12.11): Use moduleInternal instead
62[build.sc-62] [warn] ctx.root.millInternal.modules.collect { case module: PublishModule =>
63[build.sc-62] [warn] ^
64[build.sc-62] [warn] /build/repo/MillCommunityBuild.mill:263:29: object millInternal in trait Module is deprecated (since Mill 0.12.11): Use moduleInternal instead
65[build.sc-62] [warn] val testModule = module.millInternal.modules.toList
66[build.sc-62] [warn] ^
67[build.sc-62] [warn] /build/repo/MillCommunityBuild.mill:398:12: object millInternal in trait Module is deprecated (since Mill 0.12.11): Use moduleInternal instead
68[build.sc-62] [warn] ctx.root.millInternal.modules.flatMap {
69[build.sc-62] [warn] ^
70[build.sc-62] [warn] /build/repo/MillVersionCompat.mill:9:41: trait ZincWorkerModule in package scalalib is deprecated (since Mill 0.12.11): Use JvmWorkerModule instead
71[build.sc-62] [warn] type ZincWorkerModule = mill.scalalib.ZincWorkerModule
72[build.sc-62] [warn] ^
73[build.sc-62] [warn] /build/repo/build.mill:25:50: trait Target in package define is deprecated (since Mill 0.12.15): Use Task.Simple[T] or T[T] instead
74[build.sc-62] [warn] def mapScalacOptions(scalaVersion: mill.define.Target[String])(implicit ctx: mill.api.Ctx): Seq[String] =
75[build.sc-62] [warn] ^
76[build.sc-62] [warn] /build/repo/build.mill:36:79: trait Target in package define is deprecated (since Mill 0.12.15): Use Task.Simple[T] or T[T] instead
77[build.sc-62] [warn] implicit class MillCommunityBuildScalacOptionsTargetOps(asTarget: mill.define.Target[Seq[String]]){
78[build.sc-62] [warn] ^
79[build.sc-62] [warn] /build/repo/build.mill:37:50: trait Target in package define is deprecated (since Mill 0.12.15): Use Task.Simple[T] or T[T] instead
80[build.sc-62] [warn] def mapScalacOptions(scalaVersion: mill.define.Target[String]) = scalaVersion.zip(asTarget).map {
81[build.sc-62] [warn] ^
82[build.sc-62] [warn] /build/repo/build.mill:116:50: trait Target in package define is deprecated (since Mill 0.12.15): Use Task.Simple[T] or T[T] instead
83[build.sc-62] [warn] def mapScalacOptions(scalaVersion: mill.define.Target[String])(implicit ctx: mill.api.Ctx): Seq[String] =
84[build.sc-62] [warn] ^
85[build.sc-62] [warn] /build/repo/build.mill:127:79: trait Target in package define is deprecated (since Mill 0.12.15): Use Task.Simple[T] or T[T] instead
86[build.sc-62] [warn] implicit class MillCommunityBuildScalacOptionsTargetOps(asTarget: mill.define.Target[Seq[String]]){
87[build.sc-62] [warn] ^
88[build.sc-62] [warn] /build/repo/build.mill:128:50: trait Target in package define is deprecated (since Mill 0.12.15): Use Task.Simple[T] or T[T] instead
89[build.sc-62] [warn] def mapScalacOptions(scalaVersion: mill.define.Target[String]) = scalaVersion.zip(asTarget).map {
90[build.sc-62] [warn] ^
91[build.sc-62] [warn] 11 warnings found
92[build.sc-62] [info] done compiling
93[1/1] resolve
94[0J[1A
95[0J[1A
96[1/1] ============================== resolve _ ============================== 22s
97Try build using ./millw
98--disable-ticker will be removed in Mill 1.0.0, use `--ticker false`
99[mill-build/build.sc] [info] compiling 1 Scala source to /build/repo/out/mill-build/mill-build/compile.dest/classes ...
100[mill-build/build.sc] [info] done compiling
101[build.sc] [info] compiling 4 Scala sources to /build/repo/out/mill-build/compile.dest/classes ...
102[build.sc] [warn] /build/repo/CommunityBuildCore.mill:136:22: object JavaConverters in package collection is deprecated (since 2.13.0): Use `scala.jdk.CollectionConverters` instead
103[build.sc] [warn] .iterator()
104[build.sc] [warn] ^
105[build.sc] [warn] /build/repo/MillCommunityBuild.mill:222:14: object millInternal in trait Module is deprecated (since Mill 0.12.11): Use moduleInternal instead
106[build.sc] [warn] ctx.root.millInternal.modules.collect { case module: PublishModule =>
107[build.sc] [warn] ^
108[build.sc] [warn] /build/repo/MillCommunityBuild.mill:263:29: object millInternal in trait Module is deprecated (since Mill 0.12.11): Use moduleInternal instead
109[build.sc] [warn] val testModule = module.millInternal.modules.toList
110[build.sc] [warn] ^
111[build.sc] [warn] /build/repo/MillCommunityBuild.mill:398:12: object millInternal in trait Module is deprecated (since Mill 0.12.11): Use moduleInternal instead
112[build.sc] [warn] ctx.root.millInternal.modules.flatMap {
113[build.sc] [warn] ^
114[build.sc] [warn] /build/repo/MillVersionCompat.mill:9:41: trait ZincWorkerModule in package scalalib is deprecated (since Mill 0.12.11): Use JvmWorkerModule instead
115[build.sc] [warn] type ZincWorkerModule = mill.scalalib.ZincWorkerModule
116[build.sc] [warn] ^
117[build.sc] [warn] /build/repo/build.mill:25:50: trait Target in package define is deprecated (since Mill 0.12.15): Use Task.Simple[T] or T[T] instead
118[build.sc] [warn] def mapScalacOptions(scalaVersion: mill.define.Target[String])(implicit ctx: mill.api.Ctx): Seq[String] =
119[build.sc] [warn] ^
120[build.sc] [warn] /build/repo/build.mill:36:79: trait Target in package define is deprecated (since Mill 0.12.15): Use Task.Simple[T] or T[T] instead
121[build.sc] [warn] implicit class MillCommunityBuildScalacOptionsTargetOps(asTarget: mill.define.Target[Seq[String]]){
122[build.sc] [warn] ^
123[build.sc] [warn] /build/repo/build.mill:37:50: trait Target in package define is deprecated (since Mill 0.12.15): Use Task.Simple[T] or T[T] instead
124[build.sc] [warn] def mapScalacOptions(scalaVersion: mill.define.Target[String]) = scalaVersion.zip(asTarget).map {
125[build.sc] [warn] ^
126[build.sc] [warn] /build/repo/build.mill:116:50: trait Target in package define is deprecated (since Mill 0.12.15): Use Task.Simple[T] or T[T] instead
127[build.sc] [warn] def mapScalacOptions(scalaVersion: mill.define.Target[String])(implicit ctx: mill.api.Ctx): Seq[String] =
128[build.sc] [warn] ^
129[build.sc] [warn] /build/repo/build.mill:127:79: trait Target in package define is deprecated (since Mill 0.12.15): Use Task.Simple[T] or T[T] instead
130[build.sc] [warn] implicit class MillCommunityBuildScalacOptionsTargetOps(asTarget: mill.define.Target[Seq[String]]){
131[build.sc] [warn] ^
132[build.sc] [warn] /build/repo/build.mill:128:50: trait Target in package define is deprecated (since Mill 0.12.15): Use Task.Simple[T] or T[T] instead
133[build.sc] [warn] def mapScalacOptions(scalaVersion: mill.define.Target[String]) = scalaVersion.zip(asTarget).map {
134[build.sc] [warn] ^
135[build.sc] [warn] 11 warnings found
136[build.sc] [info] done compiling
137Build config: {"tests":null}
138Parsed config: ProjectBuildConfig(ProjectsConfig(List(),Map()),null)
139
140Starting build for feedletter - [0/1]
141No test module defined in
142OpenCB::Filter out '-deprecation', matches setting pattern '^-?-deprecation'
143[info] compiling 43 Scala sources to /build/repo/out/compile.dest/classes ...
144[warn] -- [E222] Syntax Warning: /build/repo/out/untemplateGenerateScala.dest/com/mchange/feedletter/default/email/composeUniversal-html-untemplate.scala:2:39
145[warn] 2 |package com.mchange.feedletter.default.email
146[warn] |^
147[warn] |The package name `composeUniversal-html-untemplate$package` will be encoded on the classpath, and can lead to undefined behaviour.
148[warn] 3 |import java.io.{Writer,StringWriter}
149[warn] 4 |import scala.collection.{immutable,mutable}
150[warn] 5 |import com.mchange.feedletter.*
151[warn] 6 |import com.mchange.feedletter.style.*
152[warn] 7 |import java.time.format.{DateTimeFormatter,FormatStyle}
153[warn] 8 |val Untemplate_composeUniversal_html = new untemplate.Untemplate[ComposeInfo.Universal,Nothing]:
154[warn] 9 | val UntemplateFunction : untemplate.Untemplate[ComposeInfo.Universal,Nothing] = this
155[warn] 10 | val UntemplateName : String = "composeUniversal_html"
156[warn] 11 | val UntemplatePackage : String = "com.mchange.feedletter.default.email"
157[warn] 12 | val UntemplateInputName : String = "info"
158[warn] 13 | val UntemplateInputTypeDeclared : String = "ComposeInfo.Universal"
159[warn] 14 | val UntemplateInputTypeCanonical : Option[String] = untemplate.Macro.nonEmptyStringOption( untemplate.Macro.recursiveCanonicalName[ComposeInfo.Universal] )
160[warn] 15 | val UntemplateInputDefaultArgument : Option[ComposeInfo.Universal] = (None : Option[ComposeInfo.Universal])
161[warn] 16 | val UntemplateOutputMetadataTypeDeclared : String = "Nothing"
162[warn] 17 | val UntemplateOutputMetadataTypeCanonical : Option[String] = untemplate.Macro.nonEmptyStringOption( untemplate.Macro.recursiveCanonicalName[Nothing] )
163[warn] 18 | val UntemplateHeaderNote : String = ""
164[warn] 19 | val UntemplateLastModified : Option[Long] = Some(1766431250883L)
165[warn] 20 | val UntemplateSynthetic : Boolean = false
166[warn] 21 | val UntemplateAttributes : immutable.Map[String,Any] = immutable.Map.empty
167[warn] 22 | def apply(info : ComposeInfo.Universal) : untemplate.Result[Nothing] =
168[warn] 23 | val writer : StringWriter = new StringWriter(17950)
169[warn] 24 | val attrs : immutable.Map[String,Any] = UntemplateAttributes
170[warn] 25 | var mbMetadata : Option[Nothing] = None
171[warn] 26 | var outputTransformer : Function1[untemplate.Result[Nothing],untemplate.Result[Nothing]] = identity
172[warn] 27 | val htmlTitle =
173[warn] 28 | info match
174[warn] 29 | case single : ComposeInfo.Single =>
175[warn] 30 | s"""[${single.subscribableName}] ${single.contents.title.getOrElse("(untitled post)")}"""
176[warn] 31 | case multiple : ComposeInfo.Multiple if multiple.contents.size == 1 =>
177[warn] 32 | s"""[${multiple.subscribableName}] New Post: ${multiple.contents.head.title.getOrElse("(untitled)")}"""
178[warn] 33 | case multiple : ComposeInfo.Multiple =>
179[warn] 34 | s"""[${multiple.subscribableName}] ${multiple.contents.size} new posts"""
180[warn] 35 | end htmlTitle
181[warn] 36 | val block0 = new Function0[String]:
182[warn] 37 | def apply() : String =
183[warn] 38 | "\n<html>\n <head>\n <style>\n" + ( style_css() ) +
184[warn] 39 | "\n </style>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>" + ( htmlTitle ) +
185[warn] 40 | "</title>\n </head>\n <body>\n <p>Dear %ToNicknameOrEmail%,</p>\n"
186[warn] 41 | writer.write(block0())
187[warn] 42 | info match
188[warn] 43 | case single : ComposeInfo.Single => {
189[warn] 44 | val block1 = new Function0[String]:
190[warn] 45 | def apply() : String =
191[warn] 46 | " <p>A " + ( ifLink(single.contents.link, "new post") ) +
192[warn] 47 | " has been published to <b>" + ( single.subscribableName ) +
193[warn] 48 | "</b>:</p>\n"
194[warn] 49 | writer.write(block1())
195[warn] 50 | }
196[warn] 51 | case multiple : ComposeInfo.Multiple if multiple.contents.size == 1 => {
197[warn] 52 | val block2 = new Function0[String]:
198[warn] 53 | def apply() : String =
199[warn] 54 | " <p>A " + ( ifLink(multiple.contents.head.link, "new post") ) +
200[warn] 55 | " has been published to <b>" + ( multiple.subscribableName ) +
201[warn] 56 | "</b>:</p>\n"
202[warn] 57 | writer.write(block2())
203[warn] 58 | }
204[warn] 59 | case multiple : ComposeInfo.Multiple => {
205[warn] 60 | val block3 = new Function0[String]:
206[warn] 61 | def apply() : String =
207[warn] 62 | " <p>The following " + ( multiple.contents.size ) +
208[warn] 63 | " posts have been published to <b>" + ( info.subscribableName ) +
209[warn] 64 | "</b>:</p>\n"
210[warn] 65 | writer.write(block3())
211[warn] 66 | }
212[warn] 67 | info.contentsSeq.foreach( ic => writer.write( item_html( info, ic ).text ) )
213[warn] 68 | val block4 = new Function0[String]:
214[warn] 69 | def apply() : String =
215[warn] 70 | "\n <div class=\"unsubscribe\">\n <p>\n You are subscribed as <code>%ToEmail%</code> to the mailing list <b>" + ( info.subscribableName ) +
216[warn] 71 | "</b>.\n We'd miss you, but you can click <a href=\"%RemoveLink%\">here</a> to unsubscribe.\n </p>\n </div>\n </body>\n</html>\n"
217[warn] 72 | writer.write(block4())
218[warn] 73 | outputTransformer( untemplate.Result( mbMetadata, writer.toString ) )
219[warn] 74 | end apply
220[warn] 75 |end Untemplate_composeUniversal_html
221[warn] 76 |def composeUniversal_html(info : ComposeInfo.Universal) : untemplate.Result[Nothing] = Untemplate_composeUniversal_html( info )
222[warn] |
223[warn] | longer explanation available when compiling with `-explain`
224[warn] -- [E222] Syntax Warning: /build/repo/out/untemplateGenerateScala.dest/com/mchange/feedletter/default/email/confirm-html-untemplate.scala:2:39
225[warn] 2 |package com.mchange.feedletter.default.email
226[warn] |^
227[warn] |The package name `confirm-html-untemplate$package` will be encoded on the classpath, and can lead to undefined behaviour.
228[warn] 3 |import java.io.{Writer,StringWriter}
229[warn] 4 |import scala.collection.{immutable,mutable}
230[warn] 5 |import com.mchange.feedletter.*
231[warn] 6 |import com.mchange.feedletter.style.*
232[warn] 7 |val Untemplate_confirm_html = new untemplate.Untemplate[ConfirmInfo,Nothing]:
233[warn] 8 | val UntemplateFunction : untemplate.Untemplate[ConfirmInfo,Nothing] = this
234[warn] 9 | val UntemplateName : String = "confirm_html"
235[warn] 10 | val UntemplatePackage : String = "com.mchange.feedletter.default.email"
236[warn] 11 | val UntemplateInputName : String = "info"
237[warn] 12 | val UntemplateInputTypeDeclared : String = "ConfirmInfo"
238[warn] 13 | val UntemplateInputTypeCanonical : Option[String] = untemplate.Macro.nonEmptyStringOption( untemplate.Macro.recursiveCanonicalName[ConfirmInfo] )
239[warn] 14 | val UntemplateInputDefaultArgument : Option[ConfirmInfo] = (None : Option[ConfirmInfo])
240[warn] 15 | val UntemplateOutputMetadataTypeDeclared : String = "Nothing"
241[warn] 16 | val UntemplateOutputMetadataTypeCanonical : Option[String] = untemplate.Macro.nonEmptyStringOption( untemplate.Macro.recursiveCanonicalName[Nothing] )
242[warn] 17 | val UntemplateHeaderNote : String = ""
243[warn] 18 | val UntemplateLastModified : Option[Long] = Some(1766431250883L)
244[warn] 19 | val UntemplateSynthetic : Boolean = false
245[warn] 20 | val UntemplateAttributes : immutable.Map[String,Any] = immutable.Map.empty
246[warn] 21 | def apply(info : ConfirmInfo) : untemplate.Result[Nothing] =
247[warn] 22 | val writer : StringWriter = new StringWriter(17380)
248[warn] 23 | val attrs : immutable.Map[String,Any] = UntemplateAttributes
249[warn] 24 | var mbMetadata : Option[Nothing] = None
250[warn] 25 | var outputTransformer : Function1[untemplate.Result[Nothing],untemplate.Result[Nothing]] = identity
251[warn] 26 | val displayName =
252[warn] 27 | val narrowed = info.subscriptionManager.narrowDestinationOrThrow( info.destination )
253[warn] 28 | info.subscriptionManager.displayShort( narrowed )
254[warn] 29 | end displayName
255[warn] 30 | val confirmHoursWarning : String =
256[warn] 31 | val prefix = "This link will expire"
257[warn] 32 | val days = info.confirmHours / 24
258[warn] 33 | if days > 30 then ""
259[warn] 34 | else if days > 0 then s"${prefix} in $days days."
260[warn] 35 | else if info.confirmHours > 0 then s"${prefix} in ${info.confirmHours} hours."
261[warn] 36 | else s"${prefix} imminently."
262[warn] 37 | end confirmHoursWarning
263[warn] 38 | val block0 = new Function0[String]:
264[warn] 39 | def apply() : String =
265[warn] 40 | "\n<html>\n <head>\n <style>\n" + ( style_css() ) +
266[warn] 41 | "\n </style>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Confirm Subscription to " + ( info.subscribableName ) +
267[warn] 42 | "</title>\n </head>\n <body class=\"confirm-body\">\n <div class=\"confirm-main\">\n <p>My dear <span class=\"confirm-user\">" + ( displayName ) +
268[warn] 43 | "</span>,</p>\n\n <p>You have <i>almost</i> subscribed to the mailing list <b>" + ( info.subscribableName ) +
269[warn] 44 | "</b>.<p>\n\n <p>Almost.</p>\n\n <p>Did you intend to subscribe, or is somebody just messing with you?</p>\n\n <ul>\n <li>\n <p>\n If you did intend to subscribe, please <a href=\"" + ( info.confirmLink ) +
270[warn] 45 | "\">click here to confirm your subscription</a>.\n " + ( confirmHoursWarning ) +
271[warn] 46 | "\n </p>\n </li>\n <li>\n <p>\n If you did not intend to subscribe, please do nothing but accept our apologies. You will receive no further mailings.\n Or you can explicitly <a href=\"" + ( info.unsubscribeLink ) +
272[warn] 47 | "\">unsubscribe</a>.\n </p>\n </li>\n </ul>\n\n <p>Love,<br>\n &nbsp;&nbsp;<i>" + ( info.subscribableName ) +
273[warn] 48 | "</i>\n </div>\n </body>\n</html>\n\n\n"
274[warn] 49 | writer.write(block0())
275[warn] 50 | outputTransformer( untemplate.Result( mbMetadata, writer.toString ) )
276[warn] 51 | end apply
277[warn] 52 |end Untemplate_confirm_html
278[warn] 53 |def confirm_html(info : ConfirmInfo) : untemplate.Result[Nothing] = Untemplate_confirm_html( info )
279[warn] |
280[warn] | longer explanation available when compiling with `-explain`
281[warn] -- [E222] Syntax Warning: /build/repo/out/untemplateGenerateScala.dest/com/mchange/feedletter/default/email/item-html-untemplate.scala:2:39
282[warn] 2 |package com.mchange.feedletter.default.email
283[warn] |^
284[warn] |The package name `item-html-untemplate$package` will be encoded on the classpath, and can lead to undefined behaviour.
285[warn] 3 |import java.io.{Writer,StringWriter}
286[warn] 4 |import scala.collection.{immutable,mutable}
287[warn] 5 |import com.mchange.feedletter.*
288[warn] 6 |import com.mchange.feedletter.style.*
289[warn] 7 |import java.time.ZoneId
290[warn] 8 |import java.time.format.{DateTimeFormatter,FormatStyle}
291[warn] 9 |val Untemplate_item_html = new untemplate.Untemplate[(ComposeInfo.Universal, ItemContent),Nothing]:
292[warn] 10 | val UntemplateFunction : untemplate.Untemplate[(ComposeInfo.Universal, ItemContent),Nothing] = this
293[warn] 11 | val UntemplateName : String = "item_html"
294[warn] 12 | val UntemplatePackage : String = "com.mchange.feedletter.default.email"
295[warn] 13 | val UntemplateInputName : String = "tup"
296[warn] 14 | val UntemplateInputTypeDeclared : String = "(ComposeInfo.Universal, ItemContent)"
297[warn] 15 | val UntemplateInputTypeCanonical : Option[String] = untemplate.Macro.nonEmptyStringOption( untemplate.Macro.recursiveCanonicalName[(ComposeInfo.Universal, ItemContent)] )
298[warn] 16 | val UntemplateInputDefaultArgument : Option[(ComposeInfo.Universal, ItemContent)] = (None : Option[(ComposeInfo.Universal, ItemContent)])
299[warn] 17 | val UntemplateOutputMetadataTypeDeclared : String = "Nothing"
300[warn] 18 | val UntemplateOutputMetadataTypeCanonical : Option[String] = untemplate.Macro.nonEmptyStringOption( untemplate.Macro.recursiveCanonicalName[Nothing] )
301[warn] 19 | val UntemplateHeaderNote : String = ""
302[warn] 20 | val UntemplateLastModified : Option[Long] = Some(1766431250883L)
303[warn] 21 | val UntemplateSynthetic : Boolean = false
304[warn] 22 | val UntemplateAttributes : immutable.Map[String,Any] = immutable.Map.empty
305[warn] 23 | def apply(tup : (ComposeInfo.Universal, ItemContent)) : untemplate.Result[Nothing] =
306[warn] 24 | val writer : StringWriter = new StringWriter(15900)
307[warn] 25 | val attrs : immutable.Map[String,Any] = UntemplateAttributes
308[warn] 26 | var mbMetadata : Option[Nothing] = None
309[warn] 27 | var outputTransformer : Function1[untemplate.Result[Nothing],untemplate.Result[Nothing]] = identity
310[warn] 28 | val formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG, FormatStyle.LONG)
311[warn] 29 | val (info, contents) = tup
312[warn] 30 | val images = contents.media.filter( _.mimeType.map( _.startsWith("image") ).getOrElse(false) )
313[warn] 31 | val (topImageUrl, bottomImageUrls) =
314[warn] 32 | images.size match
315[warn] 33 | case 0 => (None, List.empty[String])
316[warn] 34 | case 1 => (Some(images.head.url), List.empty[String])
317[warn] 35 | case n => (None, images.map(_.url))
318[warn] 36 | end val
319[warn] 37 | val block0 = new Function0[String]:
320[warn] 38 | def apply() : String =
321[warn] 39 | "\n <!-- Item GUID: " + ( contents.guid ) +
322[warn] 40 | " -->\n <div class=\"item\">\n"
323[warn] 41 | writer.write(block0())
324[warn] 42 | contents.title.foreach { title =>
325[warn] 43 | val block1 = new Function0[String]:
326[warn] 44 | def apply() : String =
327[warn] 45 | " <div class=\"item-title\">\n " + ( ifLink( contents.link, title ) ) +
328[warn] 46 | "\n </div>\n"
329[warn] 47 | writer.write(block1())
330[warn] 48 | }
331[warn] 49 | contents.author.foreach { author =>
332[warn] 50 | val block2 = new Function0[String]:
333[warn] 51 | def apply() : String =
334[warn] 52 | " <div class=\"item-author\">\n by " + ( author ) +
335[warn] 53 | "\n </div>\n"
336[warn] 54 | writer.write(block2())
337[warn] 55 | }
338[warn] 56 | topImageUrl.foreach { url =>
339[warn] 57 | val block3 = new Function0[String]:
340[warn] 58 | def apply() : String =
341[warn] 59 | " <div class=\"media-image top-image\">\n <img src=\"" + ( url ) +
342[warn] 60 | "\">\n </div>\n"
343[warn] 61 | writer.write(block3())
344[warn] 62 | }
345[warn] 63 | contents.article.foreach { article =>
346[warn] 64 | val block4 = new Function0[String]:
347[warn] 65 | def apply() : String =
348[warn] 66 | " <div class=\"item-contents\">\n " + ( article ) +
349[warn] 67 | "\n </div>\n"
350[warn] 68 | writer.write(block4())
351[warn] 69 | }
352[warn] 70 | contents.pubDate.foreach { pubDate =>
353[warn] 71 | val block5 = new Function0[String]:
354[warn] 72 | def apply() : String =
355[warn] 73 | " <div class=\"item-date\">\n Published " + ( ifLink( contents.link, formatter.format( pubDate.atZone(info.timeZone) ) ) ) +
356[warn] 74 | "\n </div>\n"
357[warn] 75 | writer.write(block5())
358[warn] 76 | }
359[warn] 77 | if bottomImageUrls.nonEmpty then {
360[warn] 78 | val block6 = new Function0[String]:
361[warn] 79 | def apply() : String =
362[warn] 80 | " <div class=\"bottom-images\">\n"
363[warn] 81 | writer.write(block6())
364[warn] 82 | bottomImageUrls.foreach { url =>
365[warn] 83 | val block7 = new Function0[String]:
366[warn] 84 | def apply() : String =
367[warn] 85 | " <div class=\"media-image bottom-image\">\n <img src=\"" + ( url ) +
368[warn] 86 | "\">\n </div>\n"
369[warn] 87 | writer.write(block7())
370[warn] 88 | }
371[warn] 89 | val block8 = new Function0[String]:
372[warn] 90 | def apply() : String =
373[warn] 91 | " </div>\n"
374[warn] 92 | writer.write(block8())
375[warn] 93 | }
376[warn] 94 | val block9 = new Function0[String]:
377[warn] 95 | def apply() : String =
378[warn] 96 | " </div>\n"
379[warn] 97 | writer.write(block9())
380[warn] 98 | outputTransformer( untemplate.Result( mbMetadata, writer.toString ) )
381[warn] 99 | end apply
382[warn] 100 |end Untemplate_item_html
383[warn] 101 |def item_html(tup : (ComposeInfo.Universal, ItemContent)) : untemplate.Result[Nothing] = Untemplate_item_html( tup )
384[warn] |
385[warn] | longer explanation available when compiling with `-explain`
386[warn] -- [E222] Syntax Warning: /build/repo/out/untemplateGenerateScala.dest/com/mchange/feedletter/default/email/removalNotification-html-untemplate.scala:2:39
387[warn] 2 |package com.mchange.feedletter.default.email
388[warn] |^
389[warn] |The package name `removalNotification-html-untemplate$package` will be encoded on the classpath, and can lead to undefined behaviour.
390[warn] 3 |import java.io.{Writer,StringWriter}
391[warn] 4 |import scala.collection.{immutable,mutable}
392[warn] 5 |import com.mchange.feedletter.*
393[warn] 6 |import com.mchange.feedletter.style.*
394[warn] 7 |val Untemplate_removalNotification_html = new untemplate.Untemplate[RemovalNotificationInfo,Nothing]:
395[warn] 8 | val UntemplateFunction : untemplate.Untemplate[RemovalNotificationInfo,Nothing] = this
396[warn] 9 | val UntemplateName : String = "removalNotification_html"
397[warn] 10 | val UntemplatePackage : String = "com.mchange.feedletter.default.email"
398[warn] 11 | val UntemplateInputName : String = "info"
399[warn] 12 | val UntemplateInputTypeDeclared : String = "RemovalNotificationInfo"
400[warn] 13 | val UntemplateInputTypeCanonical : Option[String] = untemplate.Macro.nonEmptyStringOption( untemplate.Macro.recursiveCanonicalName[RemovalNotificationInfo] )
401[warn] 14 | val UntemplateInputDefaultArgument : Option[RemovalNotificationInfo] = (None : Option[RemovalNotificationInfo])
402[warn] 15 | val UntemplateOutputMetadataTypeDeclared : String = "Nothing"
403[warn] 16 | val UntemplateOutputMetadataTypeCanonical : Option[String] = untemplate.Macro.nonEmptyStringOption( untemplate.Macro.recursiveCanonicalName[Nothing] )
404[warn] 17 | val UntemplateHeaderNote : String = ""
405[warn] 18 | val UntemplateLastModified : Option[Long] = Some(1766431250883L)
406[warn] 19 | val UntemplateSynthetic : Boolean = false
407[warn] 20 | val UntemplateAttributes : immutable.Map[String,Any] = immutable.Map.empty
408[warn] 21 | def apply(info : RemovalNotificationInfo) : untemplate.Result[Nothing] =
409[warn] 22 | val writer : StringWriter = new StringWriter(9360)
410[warn] 23 | val attrs : immutable.Map[String,Any] = UntemplateAttributes
411[warn] 24 | var mbMetadata : Option[Nothing] = None
412[warn] 25 | var outputTransformer : Function1[untemplate.Result[Nothing],untemplate.Result[Nothing]] = identity
413[warn] 26 | val displayName =
414[warn] 27 | val narrowed = info.subscriptionManager.narrowDestinationOrThrow( info.destination )
415[warn] 28 | info.subscriptionManager.displayShort( narrowed )
416[warn] 29 | end displayName
417[warn] 30 | val block0 = new Function0[String]:
418[warn] 31 | def apply() : String =
419[warn] 32 | "\n<html>\n <head>\n <style>\n" + ( style_css() ) +
420[warn] 33 | "\n </style>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Unsubscribed from " + ( info.subscribableName ) +
421[warn] 34 | "</title>\n </head>\n <body>\n <div>\n <p>Dear " + ( displayName ) +
422[warn] 35 | ",</p>\n\n <p>You have been unsubscribed from the mailing list <b>" + ( info.subscribableName ) +
423[warn] 36 | "</b>.\n \n <p style=\"font-size: 140%;\">&nbsp;&nbsp;&#x1F622;</p>\n\n <p>If you were removed in error, or if you <i>ever</i> change your mind, please <a href=\"" + ( info.resubscribeLink ) +
424[warn] 37 | "\">click here to resubscribe</a>.\n\n <p>Au revoir,<br>\n &nbsp;&nbsp;<i>" + ( info.subscribableName ) +
425[warn] 38 | "</i>\n </div>\n </body>\n</html>\n\n\n"
426[warn] 39 | writer.write(block0())
427[warn] 40 | outputTransformer( untemplate.Result( mbMetadata, writer.toString ) )
428[warn] 41 | end apply
429[warn] 42 |end Untemplate_removalNotification_html
430[warn] 43 |def removalNotification_html(info : RemovalNotificationInfo) : untemplate.Result[Nothing] = Untemplate_removalNotification_html( info )
431[warn] |
432[warn] | longer explanation available when compiling with `-explain`
433[warn] -- [E222] Syntax Warning: /build/repo/out/untemplateGenerateScala.dest/com/mchange/feedletter/default/email/statusChange-html-untemplate.scala:2:39
434[warn] 2 |package com.mchange.feedletter.default.email
435[warn] |^
436[warn] |The package name `statusChange-html-untemplate$package` will be encoded on the classpath, and can lead to undefined behaviour.
437[warn] 3 |import java.io.{Writer,StringWriter}
438[warn] 4 |import scala.collection.{immutable,mutable}
439[warn] 5 |import com.mchange.feedletter.*
440[warn] 6 |import com.mchange.feedletter.style.*
441[warn] 7 |val Untemplate_statusChange_html = new untemplate.Untemplate[StatusChangeInfo,Nothing]:
442[warn] 8 | val UntemplateFunction : untemplate.Untemplate[StatusChangeInfo,Nothing] = this
443[warn] 9 | val UntemplateName : String = "statusChange_html"
444[warn] 10 | val UntemplatePackage : String = "com.mchange.feedletter.default.email"
445[warn] 11 | val UntemplateInputName : String = "sci"
446[warn] 12 | val UntemplateInputTypeDeclared : String = "StatusChangeInfo"
447[warn] 13 | val UntemplateInputTypeCanonical : Option[String] = untemplate.Macro.nonEmptyStringOption( untemplate.Macro.recursiveCanonicalName[StatusChangeInfo] )
448[warn] 14 | val UntemplateInputDefaultArgument : Option[StatusChangeInfo] = (None : Option[StatusChangeInfo])
449[warn] 15 | val UntemplateOutputMetadataTypeDeclared : String = "Nothing"
450[warn] 16 | val UntemplateOutputMetadataTypeCanonical : Option[String] = untemplate.Macro.nonEmptyStringOption( untemplate.Macro.recursiveCanonicalName[Nothing] )
451[warn] 17 | val UntemplateHeaderNote : String = ""
452[warn] 18 | val UntemplateLastModified : Option[Long] = Some(1766431250883L)
453[warn] 19 | val UntemplateSynthetic : Boolean = false
454[warn] 20 | val UntemplateAttributes : immutable.Map[String,Any] = immutable.Map.empty
455[warn] 21 | def apply(sci : StatusChangeInfo) : untemplate.Result[Nothing] =
456[warn] 22 | val writer : StringWriter = new StringWriter(21090)
457[warn] 23 | val attrs : immutable.Map[String,Any] = UntemplateAttributes
458[warn] 24 | var mbMetadata : Option[Nothing] = None
459[warn] 25 | var outputTransformer : Function1[untemplate.Result[Nothing],untemplate.Result[Nothing]] = identity
460[warn] 26 | val d = scala.xml.Utility.escape( sci.destination.fullDesc )
461[warn] 27 | val email =
462[warn] 28 | sci.subscriptionManager match
463[warn] 29 | case _ : SubscriptionManager.Email => true
464[warn] 30 | case _ => false
465[warn] 31 | end email
466[warn] 32 | val confirmExtra = if email then "Please check your e-mail for a confirmation message." else ""
467[warn] 33 | val block0 = new Function0[String]:
468[warn] 34 | def apply() : String =
469[warn] 35 | "\n<html>\n <head>\n <style>\n" + ( style_css() ) +
470[warn] 36 | "\n </style>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>[" + ( sci.subscribableName ) +
471[warn] 37 | "] Subscription " + ( sci.change ) +
472[warn] 38 | "</title>\n </head>\n <body>\n <div class=\"item\">\n"
473[warn] 39 | writer.write(block0())
474[warn] 40 | sci.change match {
475[warn] 41 | case SubscriptionStatusChange.Created => {
476[warn] 42 | val block1 = new Function0[String]:
477[warn] 43 | def apply() : String =
478[warn] 44 | " <h1>Subscription created!</h1>\n\n <hr style=\"border-bottom: 1px solid black\">\n\n <p>" + ( d ) +
479[warn] 45 | " has been subscribed to <b>" + ( sci.subscribableName ) +
480[warn] 46 | "</b>.</p>\n"
481[warn] 47 | writer.write(block1())
482[warn] 48 | if sci.requiresConfirmation then {
483[warn] 49 | val block2 = new Function0[String]:
484[warn] 50 | def apply() : String =
485[warn] 51 | " <p>The subscription still needs to be confirmed. " + ( confirmExtra ) +
486[warn] 52 | "</p>\n\n <p>If this subscription was made error, please don't confirm it.</p>\n\n <p>Or you can explicitly <a href=\"" + ( sci.unsubscribeLink ) +
487[warn] 53 | "\">unsubscribe</a>.</p>\n"
488[warn] 54 | writer.write(block2())
489[warn] 55 | }
490[warn] 56 | else {
491[warn] 57 | val block3 = new Function0[String]:
492[warn] 58 | def apply() : String =
493[warn] 59 | " <p>If this subscription was made error, please <a href=\"" + ( sci.unsubscribeLink ) +
494[warn] 60 | "\">unsubscribe</a>.</p>\n"
495[warn] 61 | writer.write(block3())
496[warn] 62 | }
497[warn] 63 | }
498[warn] 64 | case SubscriptionStatusChange.Confirmed => {
499[warn] 65 | val block4 = new Function0[String]:
500[warn] 66 | def apply() : String =
501[warn] 67 | " <h1>Subscription confirmed!</h1>\n\n <hr style=\"border-bottom: 1px solid black\">\n\n <p>The subscription of " + ( d ) +
502[warn] 68 | " to <b>" + ( sci.subscribableName ) +
503[warn] 69 | "</b> has been confirmed.</p>\n\n <p>If you confirmed this subscription in error, you can <a href=\"" + ( sci.unsubscribeLink ) +
504[warn] 70 | "\">unsubscribe</a>.</p>\n"
505[warn] 71 | writer.write(block4())
506[warn] 72 | }
507[warn] 73 | case SubscriptionStatusChange.Removed => {
508[warn] 74 | val block5 = new Function0[String]:
509[warn] 75 | def apply() : String =
510[warn] 76 | " <h1>Subscription removed!</h1>\n\n <hr style=\"border-bottom: 1px solid black\">\n\n <p>" + ( d ) +
511[warn] 77 | " has been unsubscribed from <b>" + ( sci.subscribableName ) +
512[warn] 78 | "</b>.</p>\n\n <p>If you unsubscribed in error, you can resubscribe by <a href=\"" + ( sci.resubscribeLink ) +
513[warn] 79 | "\">clicking here</a>.</p>\n"
514[warn] 80 | writer.write(block5())
515[warn] 81 | }
516[warn] 82 | }
517[warn] 83 | val block6 = new Function0[String]:
518[warn] 84 | def apply() : String =
519[warn] 85 | " </div>\n </body>\n</html>\n\n\n"
520[warn] 86 | writer.write(block6())
521[warn] 87 | outputTransformer( untemplate.Result( mbMetadata, writer.toString ) )
522[warn] 88 | end apply
523[warn] 89 |end Untemplate_statusChange_html
524[warn] 90 |def statusChange_html(sci : StatusChangeInfo) : untemplate.Result[Nothing] = Untemplate_statusChange_html( sci )
525[warn] |
526[warn] | longer explanation available when compiling with `-explain`
527[warn] -- [E222] Syntax Warning: /build/repo/out/untemplateGenerateScala.dest/com/mchange/feedletter/default/email/style-css-untemplate.scala:2:39
528[warn] 2 |package com.mchange.feedletter.default.email
529[warn] |^
530[warn] |The package name `style-css-untemplate$package` will be encoded on the classpath, and can lead to undefined behaviour.
531[warn] 3 |import java.io.{Writer,StringWriter}
532[warn] 4 |import scala.collection.{immutable,mutable}
533[warn] 5 |import com.mchange.feedletter.*
534[warn] 6 |import com.mchange.feedletter.style.*
535[warn] 7 |val Untemplate_style_css = new untemplate.Untemplate[immutable.Map[String,Any],Nothing]:
536[warn] 8 | val UntemplateFunction : untemplate.Untemplate[immutable.Map[String,Any],Nothing] = this
537[warn] 9 | val UntemplateName : String = "style_css"
538[warn] 10 | val UntemplatePackage : String = "com.mchange.feedletter.default.email"
539[warn] 11 | val UntemplateInputName : String = "input"
540[warn] 12 | val UntemplateInputTypeDeclared : String = "immutable.Map[String,Any]"
541[warn] 13 | val UntemplateInputTypeCanonical : Option[String] = untemplate.Macro.nonEmptyStringOption( untemplate.Macro.recursiveCanonicalName[immutable.Map[String,Any]] )
542[warn] 14 | val UntemplateInputDefaultArgument : Option[immutable.Map[String,Any]] = Some(immutable.Map.empty)
543[warn] 15 | val UntemplateOutputMetadataTypeDeclared : String = "Nothing"
544[warn] 16 | val UntemplateOutputMetadataTypeCanonical : Option[String] = untemplate.Macro.nonEmptyStringOption( untemplate.Macro.recursiveCanonicalName[Nothing] )
545[warn] 17 | val UntemplateHeaderNote : String = ""
546[warn] 18 | val UntemplateLastModified : Option[Long] = Some(1766431250883L)
547[warn] 19 | val UntemplateSynthetic : Boolean = false
548[warn] 20 | val UntemplateAttributes : immutable.Map[String,Any] = immutable.Map.empty
549[warn] 21 | def apply(input : immutable.Map[String,Any] = immutable.Map.empty) : untemplate.Result[Nothing] =
550[warn] 22 | val writer : StringWriter = new StringWriter(22740)
551[warn] 23 | val attrs : immutable.Map[String,Any] = UntemplateAttributes
552[warn] 24 | var mbMetadata : Option[Nothing] = None
553[warn] 25 | var outputTransformer : Function1[untemplate.Result[Nothing],untemplate.Result[Nothing]] = identity
554[warn] 26 | val block0 = new Function0[String]:
555[warn] 27 | def apply() : String =
556[warn] 28 | " :root {\n font-size: 15pt;\n }\n body {\n padding-left: 1rem;\n padding-right: 1rem;\n color: black;\n background-color: #eff3f5;\n font-family: Garamond, serif;\n line-height: 150%;\n }\n body.confirm-body {\n background-color: #eeeef8;\n }\n h1, h2, h3, h4, h5 {\n font-family: Verdana, sans-serif;\n font-weight: bold;\n line-height: 120%;\n }\n code {\n font-size: 70%;\n }\n .item {\n background-color: white;\n margin-top: 2rem;\n margin-left: 10%;\n margin-right: 10%;\n padding-top: 1rem;\n padding-bottom: 1rem;\n padding-left: 2rem;\n padding-right: 2rem;\n border: 1px solid #aaaaaa;\n line-height: 150%;\n }\n .item-title {\n font-size: 150%;\n font-family: Verdana, sans-serif;\n font-weight: bold;\n padding-top: 1rem;\n }\n .item-title a {\n text-decoration: none;\n color: black;\n line-height: 120%;\n }\n .item-title a:hover {\n text-decoration: underline;\n }\n .item-author {\n margin-top: 0.25rem;\n margin-bottom: 1rem;\n font-family: Verdana, sans-serif;\n font-style: italic;\n font-size: 80%;\n border-bottom: 1px solid black;\n }\n .item-date {\n margin-top: 0.4rem;\n border-top: 1px solid black;\n text-align: right;\n font-family: Verdana, sans-serif;\n font-style: italic;\n font-size: 60%;\n }\n .item-date a {\n color: black;\n text-decoration: none;\n }\n .item-date a:visited {\n color: black;\n text-decoration: none;\n }\n .item-date a:hover {\n text-decoration: underline;\n }\n .item-contents {\n }\n .item-contents blockquote {\n margin-left: 0;\n padding-left: 1em;\n border-left: 2px solid black;\n }\n .media-image {\n width: 100%;\n }\n .media-image img {\n width: 100%;\n }\n .unsubscribe {\n padding-top: 0.5rem;\n }\n .confirm-main {\n background-color: white;\n border: 1px solid black;\n margin-left: 10%;\n margin-right: 10%;\n padding-left: 2rem;\n padding-right: 2rem;\n margin-top: 1rem;\n }\n .confirm-user {\n font-weight: bold;\n color: #008800;\n }\n @media screen and (max-width: 600px) {\n body {\n line-height: 120%;\n padding-left: 0.3rem;\n padding-right: 0.3rem;\n }\n .item {\n margin-top: 1rem;\n margin-left: 0;\n margin-right: 0;\n padding-left: 3.5%;\n padding-right: 3.5%;\n }\n .confirm-main {\n margin-left: 2%;\n margin-right: 2%;\n }\n }\n"
557[warn] 29 | writer.write(block0())
558[warn] 30 | outputTransformer( untemplate.Result( mbMetadata, writer.toString ) )
559[warn] 31 | end apply
560[warn] 32 |end Untemplate_style_css
561[warn] 33 |def style_css(input : immutable.Map[String,Any] = immutable.Map.empty) : untemplate.Result[Nothing] = Untemplate_style_css( input )
562[warn] |
563[warn] | longer explanation available when compiling with `-explain`
564[warn] -- [E222] Syntax Warning: /build/repo/out/untemplateGenerateScala.dest/com/mchange/feedletter/default/email/untemplate-util.scala:2:39
565[warn] 2 |package com.mchange.feedletter.default.email
566[warn] |^
567[warn] |The package name `untemplate-util$package` will be encoded on the classpath, and can lead to undefined behaviour.
568[warn] 3 |def ifLink( link : Option[String], text : String ) : String =
569[warn] 4 | link.fold(text)(l => s"""<a href="$l">$text</a>""")
570[warn] 5 |end ifLink
571[warn] |
572[warn] | longer explanation available when compiling with `-explain`
573[warn] -- Warning: /build/repo/src/com/mchange/feedletter/AbstractMain.scala:104:42 ---
574[warn] 104 | ZLayer.fromFunction( createDataSource _ )
575[warn] | ^^^^^^^^^^^^^^^^^^
576[warn] |The syntax `<function> _` is no longer supported;
577[warn] |you can simply leave out the trailing ` _`
578[warn] |This construct can be rewritten automatically under -rewrite -source 3.4-migration.
579[warn] -- [E222] Syntax Warning: /build/repo/src/com/mchange/feedletter/style/serve-or-mail.scala:1:31
580[warn] 1 |package com.mchange.feedletter.style
581[warn] |^
582[warn] |The package name `serve-or-mail$package` will be encoded on the classpath, and can lead to undefined behaviour.
583[warn] 2 |import zio.*
584[warn] 3 |import java.time.ZoneId
585[warn] 4 |import com.mchange.feedletter.*
586[warn] 5 |import com.mchange.feedletter.api.ApiLinkGenerator
587[warn] 6 |import com.mchange.mailutil.Smtp
588[warn] 7 |import com.mchange.conveniences.collection.*
589[warn] 8 |import com.mchange.feedletter.db.PgDatabase.subscriptionsForSubscribableName
590[warn] 9 |object DummyApiLinkGenerator extends ApiLinkGenerator:
591[warn] 10 | def createGetLink( subscribableName : SubscribableName, destination : Destination ) : String =
592[warn] 11 | s"http://localhost:8024/v0/subscription/create?subscribableName=${subscribableName}&destinationType=Email&addressPart=fakeuser%40example.com"
593[warn] 12 | def confirmGetLink( sid : SubscriptionId ) : String =
594[warn] 13 | s"http://localhost:8024/v0/subscription/confirm?subscriptionId=${sid}&invitation=fake"
595[warn] 14 | def removeGetLink( sid : SubscriptionId ) : String =
596[warn] 15 | s"http://localhost:8024/v0/subscription/remove?subscriptionId=${sid}&invitation=fake"
597[warn] 16 |def serveOneHtmlPage( html : String, interface : String, port : Int ) : Task[Unit] =
598[warn] 17 | import zio.http.Server
599[warn] 18 | import sttp.tapir.ztapir.*
600[warn] 19 | import sttp.tapir.server.ziohttp.ZioHttpInterpreter
601[warn] 20 | val rootEndpoint = endpoint.get.out( htmlBodyUtf8 )
602[warn] 21 | val indexEndpoint = endpoint.in("index.html").get.out( htmlBodyUtf8 )
603[warn] 22 | val logic : Unit => UIO[String] = _ => ZIO.succeed( html )
604[warn] 23 | val httpApp = ZioHttpInterpreter().toHttp( List(rootEndpoint.zServerLogic(logic), indexEndpoint.zServerLogic(logic) ) )
605[warn] 24 | for
606[warn] 25 | _ <- Console.printLine( s"Starting single-page webserver on interface '${interface}', port ${port}..." )
607[warn] 26 | _ <- Server.serve(httpApp).provide(ZLayer.succeed(Server.Config.default.binding(interface,port)), Server.live)
608[warn] 27 | _ <- ZIO.never
609[warn] 28 | yield ()
610[warn] 29 |def serveOrMailStatusChangeUntemplate(
611[warn] 30 | untemplateName : String,
612[warn] 31 | statusChange : SubscriptionStatusChange,
613[warn] 32 | subscribableName : SubscribableName,
614[warn] 33 | subscriptionManager : SubscriptionManager,
615[warn] 34 | destination : subscriptionManager.D,
616[warn] 35 | requiresConfirmation : Boolean,
617[warn] 36 | styleDest : StyleDest,
618[warn] 37 | appSetup : AppSetup
619[warn] 38 |) : Task[Unit] =
620[warn] 39 | styleDest match
621[warn] 40 | case StyleDest.Serve( interface, port ) =>
622[warn] 41 | serveStatusChangeUntemplate( untemplateName, statusChange, subscribableName, subscriptionManager, destination, requiresConfirmation, interface, port )
623[warn] 42 | case StyleDest.Mail( from, to ) =>
624[warn] 43 | mailStatusChangeUntemplate( untemplateName, statusChange, subscribableName, subscriptionManager, destination, requiresConfirmation, from, to, appSetup.smtpContext )
625[warn] 44 |def serveStatusChangeUntemplate(
626[warn] 45 | untemplateName : String,
627[warn] 46 | statusChange : SubscriptionStatusChange,
628[warn] 47 | subscribableName : SubscribableName,
629[warn] 48 | subscriptionManager : SubscriptionManager,
630[warn] 49 | destination : subscriptionManager.D,
631[warn] 50 | requiresConfirmation : Boolean,
632[warn] 51 | interface : String,
633[warn] 52 | port : Int
634[warn] 53 |) : Task[Unit] =
635[warn] 54 | val filled = fillStatusChangeTemplate( untemplateName, statusChange, subscribableName, subscriptionManager, destination, requiresConfirmation )
636[warn] 55 | serveOneHtmlPage( filled, interface, port )
637[warn] 56 |def mailStatusChangeUntemplate(
638[warn] 57 | untemplateName : String,
639[warn] 58 | statusChange : SubscriptionStatusChange,
640[warn] 59 | subscribableName : SubscribableName,
641[warn] 60 | subscriptionManager : SubscriptionManager,
642[warn] 61 | destination : subscriptionManager.D,
643[warn] 62 | requiresConfirmation : Boolean,
644[warn] 63 | from : Smtp.Address,
645[warn] 64 | to : Smtp.Address,
646[warn] 65 | smtpContext : Smtp.Context
647[warn] 66 |) : Task[Unit] =
648[warn] 67 | ZIO.attempt:
649[warn] 68 | val filled = fillStatusChangeTemplate( untemplateName, statusChange, subscribableName, subscriptionManager, destination, requiresConfirmation )
650[warn] 69 | given ctx : Smtp.Context = smtpContext
651[warn] 70 | Smtp.sendSimpleHtmlOnly(filled, from = from, to = to, subject = s"[${subscribableName}] Example Status Change")
652[warn] 71 | println( "Mail sent." )
653[warn] 72 |def serveOrMailComposeMultipleUntemplate(
654[warn] 73 | untemplateName : String,
655[warn] 74 | subscribableName : SubscribableName,
656[warn] 75 | subscriptionManager : SubscriptionManager,
657[warn] 76 | withinTypeId : String,
658[warn] 77 | destination : subscriptionManager.D,
659[warn] 78 | timeZone : ZoneId,
660[warn] 79 | feedUrl : FeedUrl,
661[warn] 80 | digest : FeedDigest,
662[warn] 81 | guids : Seq[Guid],
663[warn] 82 | styleDest : StyleDest,
664[warn] 83 | appSetup : AppSetup
665[warn] 84 |) : Task[Unit] =
666[warn] 85 | styleDest match
667[warn] 86 | case StyleDest.Serve( interface, port ) =>
668[warn] 87 | serveComposeMultipleUntemplate( untemplateName, subscribableName, subscriptionManager, withinTypeId, destination, timeZone, feedUrl, digest, guids, interface, port )
669[warn] 88 | case StyleDest.Mail( from, to ) =>
670[warn] 89 | mailComposeMultipleUntemplate( untemplateName, subscribableName, subscriptionManager, withinTypeId, destination, timeZone, feedUrl, digest, guids, from, to, appSetup.smtpContext )
671[warn] 90 |def serveComposeMultipleUntemplate(
672[warn] 91 | untemplateName : String,
673[warn] 92 | subscribableName : SubscribableName,
674[warn] 93 | subscriptionManager : SubscriptionManager,
675[warn] 94 | withinTypeId : String,
676[warn] 95 | destination : subscriptionManager.D,
677[warn] 96 | timeZone : ZoneId,
678[warn] 97 | feedUrl : FeedUrl,
679[warn] 98 | digest : FeedDigest,
680[warn] 99 | guids : Seq[Guid],
681[warn] 100 | interface : String,
682[warn] 101 | port : Int
683[warn] 102 |) : Task[Unit] =
684[warn] 103 | val composed = fillComposeMultipleUntemplate(untemplateName,subscribableName,subscriptionManager,withinTypeId,destination,timeZone,feedUrl,digest,guids)
685[warn] 104 | composed match
686[warn] 105 | case Some(c) => serveOneHtmlPage( c, interface, port )
687[warn] 106 | case None => Console.printLine(s"""After customization, perhaps also before, there were no contents to display. Original guids: ${digest.fileOrderedGuids.mkString(", ")}""")
688[warn] 107 |def mailComposeMultipleUntemplate(
689[warn] 108 | untemplateName : String,
690[warn] 109 | subscribableName : SubscribableName,
691[warn] 110 | subscriptionManager : SubscriptionManager,
692[warn] 111 | withinTypeId : String,
693[warn] 112 | destination : subscriptionManager.D,
694[warn] 113 | timeZone : ZoneId,
695[warn] 114 | feedUrl : FeedUrl,
696[warn] 115 | digest : FeedDigest,
697[warn] 116 | guids : Seq[Guid],
698[warn] 117 | from : Smtp.Address,
699[warn] 118 | to : Smtp.Address,
700[warn] 119 | smtpContext : Smtp.Context
701[warn] 120 |) : Task[Unit] =
702[warn] 121 | val composed = fillComposeMultipleUntemplate(untemplateName,subscribableName,subscriptionManager,withinTypeId,destination,timeZone,feedUrl,digest,guids)
703[warn] 122 | composed match
704[warn] 123 | case Some(c) =>
705[warn] 124 | val contents = guids.map( digest.guidToItemContent.get ).flatten
706[warn] 125 | val subject =
707[warn] 126 | subscriptionManager match
708[warn] 127 | case esm : SubscriptionManager.Email => "EXAMPLE: " + esm.subject( subscribableName, withinTypeId, feedUrl, contents, timeZone )
709[warn] 128 | case _ => s"[${subscribableName}] Example multiple-item notification"
710[warn] 129 | ZIO.attempt:
711[warn] 130 | given ctx : Smtp.Context = smtpContext
712[warn] 131 | Smtp.sendSimpleHtmlOnly(c, from = from, to = to, subject = subject)
713[warn] 132 | println( "Mail sent." )
714[warn] 133 | case None =>
715[warn] 134 | Console.printLine(s"""After customization, perhaps also before, there were no contents to display. Original guids: ${digest.fileOrderedGuids.mkString(", ")}""")
716[warn] 135 |def serveOrMailComposeSingleUntemplate(
717[warn] 136 | untemplateName : String,
718[warn] 137 | subscribableName : SubscribableName,
719[warn] 138 | subscriptionManager : SubscriptionManager,
720[warn] 139 | withinTypeId : String,
721[warn] 140 | destination : subscriptionManager.D,
722[warn] 141 | timeZone : ZoneId,
723[warn] 142 | feedUrl : FeedUrl,
724[warn] 143 | digest : FeedDigest,
725[warn] 144 | guid : Guid,
726[warn] 145 | styleDest : StyleDest,
727[warn] 146 | appSetup : AppSetup
728[warn] 147 |) : Task[Unit] =
729[warn] 148 | styleDest match
730[warn] 149 | case StyleDest.Serve( interface, port ) =>
731[warn] 150 | serveComposeSingleUntemplate( untemplateName, subscribableName, subscriptionManager, withinTypeId, destination, timeZone, feedUrl, digest, guid, interface, port )
732[warn] 151 | case StyleDest.Mail( from, to ) =>
733[warn] 152 | mailComposeSingleUntemplate( untemplateName, subscribableName, subscriptionManager, withinTypeId, destination, timeZone, feedUrl, digest, guid, from, to, appSetup.smtpContext )
734[warn] 153 |def serveComposeSingleUntemplate(
735[warn] 154 | untemplateName : String,
736[warn] 155 | subscribableName : SubscribableName,
737[warn] 156 | subscriptionManager : SubscriptionManager,
738[warn] 157 | withinTypeId : String,
739[warn] 158 | destination : subscriptionManager.D,
740[warn] 159 | timeZone : ZoneId,
741[warn] 160 | feedUrl : FeedUrl,
742[warn] 161 | digest : FeedDigest,
743[warn] 162 | guid : Guid,
744[warn] 163 | interface : String,
745[warn] 164 | port : Int
746[warn] 165 |) : Task[Unit] =
747[warn] 166 | val composed = fillComposeSingleUntemplate(untemplateName,subscribableName,subscriptionManager,withinTypeId,destination,timeZone,feedUrl,digest,guid)
748[warn] 167 | composed match
749[warn] 168 | case Some(c) => serveOneHtmlPage( c, interface, port )
750[warn] 169 | case None => Console.printLine(s"After customization, there were no contents to display. Original contents: ${digest.guidToItemContent( guid )}")
751[warn] 170 |def mailComposeSingleUntemplate(
752[warn] 171 | untemplateName : String,
753[warn] 172 | subscribableName : SubscribableName,
754[warn] 173 | subscriptionManager : SubscriptionManager,
755[warn] 174 | withinTypeId : String,
756[warn] 175 | destination : subscriptionManager.D,
757[warn] 176 | timeZone : ZoneId,
758[warn] 177 | feedUrl : FeedUrl,
759[warn] 178 | digest : FeedDigest,
760[warn] 179 | guid : Guid,
761[warn] 180 | from : Smtp.Address,
762[warn] 181 | to : Smtp.Address,
763[warn] 182 | smtpContext : Smtp.Context
764[warn] 183 |) : Task[Unit] =
765[warn] 184 | val composed = fillComposeSingleUntemplate(untemplateName,subscribableName,subscriptionManager,withinTypeId,destination,timeZone,feedUrl,digest,guid)
766[warn] 185 | composed match
767[warn] 186 | case Some(c) =>
768[warn] 187 | val contents = digest.guidToItemContent( guid )
769[warn] 188 | val subject =
770[warn] 189 | subscriptionManager match
771[warn] 190 | case esm : SubscriptionManager.Email => "EXAMPLE: " + esm.subject( subscribableName, withinTypeId, feedUrl, Seq(contents), timeZone )
772[warn] 191 | case _ => s"[${subscribableName}] Example single-item notification"
773[warn] 192 | ZIO.attempt:
774[warn] 193 | given ctx : Smtp.Context = smtpContext
775[warn] 194 | Smtp.sendSimpleHtmlOnly(c, from = from, to = to, subject = subject)
776[warn] 195 | println( "Mail sent." )
777[warn] 196 | case None =>
778[warn] 197 | Console.printLine(s"After customization, there were no contents to display. Original contents: ${digest.guidToItemContent( guid )}")
779[warn] 198 |def serveOrMailConfirmUntemplate(
780[warn] 199 | untemplateName : String,
781[warn] 200 | subscribableName : SubscribableName,
782[warn] 201 | subscriptionManager : SubscriptionManager,
783[warn] 202 | destination : subscriptionManager.D,
784[warn] 203 | feedUrl : FeedUrl,
785[warn] 204 | confirmHours : Int,
786[warn] 205 | styleDest : StyleDest,
787[warn] 206 | as : AppSetup
788[warn] 207 |) : Task[Unit] =
789[warn] 208 | styleDest match
790[warn] 209 | case StyleDest.Serve( interface, port ) =>
791[warn] 210 | serveConfirmUntemplate( untemplateName, subscribableName, subscriptionManager, destination, feedUrl, confirmHours, interface, port )
792[warn] 211 | case StyleDest.Mail( from, to ) =>
793[warn] 212 | mailConfirmUntemplate( untemplateName, subscribableName, subscriptionManager, destination, feedUrl, confirmHours, from, to, as.smtpContext )
794[warn] 213 |def serveConfirmUntemplate(
795[warn] 214 | untemplateName : String,
796[warn] 215 | subscribableName : SubscribableName,
797[warn] 216 | subscriptionManager : SubscriptionManager,
798[warn] 217 | destination : subscriptionManager.D,
799[warn] 218 | feedUrl : FeedUrl,
800[warn] 219 | confirmHours : Int,
801[warn] 220 | interface : String,
802[warn] 221 | port : Int
803[warn] 222 |) : Task[Unit] =
804[warn] 223 | val filled = fillConfirmUntemplate(untemplateName,subscribableName,subscriptionManager,destination,feedUrl,confirmHours)
805[warn] 224 | serveOneHtmlPage( filled, interface, port )
806[warn] 225 |def mailConfirmUntemplate(
807[warn] 226 | untemplateName : String,
808[warn] 227 | subscribableName : SubscribableName,
809[warn] 228 | subscriptionManager : SubscriptionManager,
810[warn] 229 | destination : subscriptionManager.D,
811[warn] 230 | feedUrl : FeedUrl,
812[warn] 231 | confirmHours : Int,
813[warn] 232 | from : Smtp.Address,
814[warn] 233 | to : Smtp.Address,
815[warn] 234 | smtpContext : Smtp.Context
816[warn] 235 |) : Task[Unit] =
817[warn] 236 | ZIO.attempt:
818[warn] 237 | val filled = fillConfirmUntemplate(untemplateName,subscribableName,subscriptionManager,destination,feedUrl,confirmHours)
819[warn] 238 | given ctx : Smtp.Context = smtpContext
820[warn] 239 | Smtp.sendSimpleHtmlOnly(filled, from = from, to = to, subject = s"[${subscribableName}] Example Confirm")
821[warn] 240 | println( "Mail sent." )
822[warn] 241 |def serveOrMailRemovalNotificationUntemplate(
823[warn] 242 | untemplateName : String,
824[warn] 243 | subscribableName : SubscribableName,
825[warn] 244 | subscriptionManager : SubscriptionManager,
826[warn] 245 | destination : subscriptionManager.D,
827[warn] 246 | styleDest : StyleDest,
828[warn] 247 | appSetup : AppSetup
829[warn] 248 |) : Task[Unit] =
830[warn] 249 | styleDest match
831[warn] 250 | case StyleDest.Serve( interface, port ) =>
832[warn] 251 | serveRemovalNotificationUntemplate( untemplateName, subscribableName, subscriptionManager, destination, interface, port )
833[warn] 252 | case StyleDest.Mail( from, to ) =>
834[warn] 253 | mailRemovalNotificationUntemplate( untemplateName, subscribableName, subscriptionManager, destination, from, to, appSetup.smtpContext )
835[warn] 254 |def serveRemovalNotificationUntemplate(
836[warn] 255 | untemplateName : String,
837[warn] 256 | subscribableName : SubscribableName,
838[warn] 257 | subscriptionManager : SubscriptionManager,
839[warn] 258 | destination : subscriptionManager.D,
840[warn] 259 | interface : String,
841[warn] 260 | port : Int
842[warn] 261 |) : Task[Unit] =
843[warn] 262 | val filled = fillRemovalNotificationUntemplate(untemplateName,subscribableName,subscriptionManager,destination)
844[warn] 263 | serveOneHtmlPage( filled, interface, port )
845[warn] 264 |def mailRemovalNotificationUntemplate(
846[warn] 265 | untemplateName : String,
847[warn] 266 | subscribableName : SubscribableName,
848[warn] 267 | subscriptionManager : SubscriptionManager,
849[warn] 268 | destination : subscriptionManager.D,
850[warn] 269 | from : Smtp.Address,
851[warn] 270 | to : Smtp.Address,
852[warn] 271 | smtpContext : Smtp.Context
853[warn] 272 |) : Task[Unit] =
854[warn] 273 | ZIO.attempt:
855[warn] 274 | val filled = fillRemovalNotificationUntemplate(untemplateName,subscribableName,subscriptionManager,destination)
856[warn] 275 | given ctx : Smtp.Context = smtpContext
857[warn] 276 | Smtp.sendSimpleHtmlOnly(filled, from = from, to = to, subject = s"[${subscribableName}] Example Removal Notification")
858[warn] 277 | println( "Mail sent." )
859[warn] 278 |private def fillStatusChangeTemplate(
860[warn] 279 | untemplateName : String,
861[warn] 280 | statusChange : SubscriptionStatusChange,
862[warn] 281 | subscribableName : SubscribableName,
863[warn] 282 | subscriptionManager : SubscriptionManager,
864[warn] 283 | destination : subscriptionManager.D,
865[warn] 284 | requiresConfirmation : Boolean
866[warn] 285 |) : String =
867[warn] 286 | val unsubscribeLink = DummyApiLinkGenerator.removeGetLink(SubscriptionId(0))
868[warn] 287 | val resubscribeLink = DummyApiLinkGenerator.createGetLink(subscribableName,destination)
869[warn] 288 | val sci = StatusChangeInfo( statusChange, subscribableName, subscriptionManager, destination, requiresConfirmation, unsubscribeLink, resubscribeLink )
870[warn] 289 | val untemplate = AllUntemplates.findStatusChangeUntemplate( untemplateName )
871[warn] 290 | untemplate( sci ).text
872[warn] 291 |private def fillComposeMultipleUntemplate(
873[warn] 292 | untemplateName : String,
874[warn] 293 | subscribableName : SubscribableName,
875[warn] 294 | subscriptionManager : SubscriptionManager,
876[warn] 295 | withinTypeId : String,
877[warn] 296 | destination : subscriptionManager.D,
878[warn] 297 | timeZone : ZoneId,
879[warn] 298 | feedUrl : FeedUrl,
880[warn] 299 | digest : FeedDigest,
881[warn] 300 | guids : Seq[Guid]
882[warn] 301 |) : Option[String] =
883[warn] 302 | val rawContents = guids.map( digest.guidToItemContent.get ).collect { case Some(content) => content }
884[warn] 303 | val filteredContents = rawContents.filter( c => subscriptionManager.checkFilter(subscribableName, c) )
885[warn] 304 | val contents = subscriptionManager.transformContentsForRoute( AssignableKey(subscribableName, withinTypeId), feedUrl, filteredContents, timeZone )
886[warn] 305 | if contents.nonEmpty then
887[warn] 306 | val composeInfo = ComposeInfo.Multiple( feedUrl, subscribableName, subscriptionManager, withinTypeId, timeZone, contents )
888[warn] 307 | val untemplate = AllUntemplates.findComposeUntemplateMultiple( untemplateName )
889[warn] 308 | val composed =
890[warn] 309 | val untemplateOutput = untemplate( composeInfo ).text
891[warn] 310 | val sid = SubscriptionId(0)
892[warn] 311 | val templateParams = subscriptionManager.composeTemplateParams( subscribableName, withinTypeId, feedUrl, destination, sid, DummyApiLinkGenerator.removeGetLink(sid) )
893[warn] 312 | templateParams.fill( untemplateOutput )
894[warn] 313 | Some(composed)
895[warn] 314 | else
896[warn] 315 | None
897[warn] 316 |private def fillComposeSingleUntemplate(
898[warn] 317 | untemplateName : String,
899[warn] 318 | subscribableName : SubscribableName,
900[warn] 319 | subscriptionManager : SubscriptionManager,
901[warn] 320 | withinTypeId : String,
902[warn] 321 | destination : subscriptionManager.D,
903[warn] 322 | timeZone : ZoneId,
904[warn] 323 | feedUrl : FeedUrl,
905[warn] 324 | digest : FeedDigest,
906[warn] 325 | guid : Guid
907[warn] 326 |) : Option[String] =
908[warn] 327 | val filteredContents = Seq(digest.guidToItemContent( guid )).filter( c => subscriptionManager.checkFilter(subscribableName, c) )
909[warn] 328 | val contents = subscriptionManager.transformContentsForRoute( AssignableKey(subscribableName, withinTypeId), feedUrl, filteredContents, timeZone )
910[warn] 329 | if contents.nonEmpty then
911[warn] 330 | val uniqueContent = contents.uniqueOr: (c, nu) =>
912[warn] 331 | throw new WrongContentsMultiplicity(s"${this}: We expect exactly one item to render, found $nu: " + contents.map( ci => (ci.title orElse ci.link).getOrElse("<item>") ).mkString(", "))
913[warn] 332 | val composeInfo = ComposeInfo.Single( feedUrl, subscribableName, subscriptionManager, withinTypeId, timeZone, uniqueContent )
914[warn] 333 | val untemplate = AllUntemplates.findComposeUntemplateSingle( untemplateName )
915[warn] 334 | val composed =
916[warn] 335 | val untemplateOutput = untemplate( composeInfo ).text
917[warn] 336 | val sid = SubscriptionId(0)
918[warn] 337 | val templateParams = subscriptionManager.composeTemplateParams( subscribableName, withinTypeId, feedUrl, destination, sid, DummyApiLinkGenerator.removeGetLink(sid) )
919[warn] 338 | templateParams.fill( untemplateOutput )
920[warn] 339 | Some(composed)
921[warn] 340 | else
922[warn] 341 | None
923[warn] 342 |private def fillConfirmUntemplate(
924[warn] 343 | untemplateName : String,
925[warn] 344 | subscribableName : SubscribableName,
926[warn] 345 | subscriptionManager : SubscriptionManager,
927[warn] 346 | destination : subscriptionManager.D,
928[warn] 347 | feedUrl : FeedUrl,
929[warn] 348 | confirmHours : Int
930[warn] 349 |) : String =
931[warn] 350 | val sid = SubscriptionId(0)
932[warn] 351 | val confirmInfo = ConfirmInfo( destination, subscribableName, subscriptionManager, DummyApiLinkGenerator.confirmGetLink(sid), DummyApiLinkGenerator.removeGetLink(sid), confirmHours )
933[warn] 352 | val untemplate = AllUntemplates.findConfirmUntemplate( untemplateName )
934[warn] 353 | untemplate( confirmInfo ).text
935[warn] 354 |private def fillRemovalNotificationUntemplate(
936[warn] 355 | untemplateName : String,
937[warn] 356 | subscribableName : SubscribableName,
938[warn] 357 | subscriptionManager : SubscriptionManager,
939[warn] 358 | destination : subscriptionManager.D
940[warn] 359 |) : String =
941[warn] 360 | val sid = SubscriptionId(0)
942[warn] 361 | val rnInfo = RemovalNotificationInfo( subscribableName, subscriptionManager, destination, DummyApiLinkGenerator.createGetLink(subscribableName,destination))
943[warn] 362 | val untemplate = AllUntemplates.findRemovalNotificationUntemplate( untemplateName )
944[warn] 363 | untemplate( rnInfo ).text
945[warn] |
946[warn] | longer explanation available when compiling with `-explain`
947[warn] 9 warnings found
948[info] done compiling
949Successfully evaluated compile
950Option -classpath was updated
951Unsupported type: Not supported type in refinement AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Option),List(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class feedletter)),object style),ConfirmInfo))): untemplate.Untemplate[com.mchange.feedletter.style.ConfirmInfo, scala.Nothing] {
952 val UntemplateInputDefaultArgument: scala.Option[com.mchange.feedletter.style.ConfirmInfo]
953}
954Unsupported type: Not supported type in refinement AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Option),List(AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Tuple2),List(TypeRef(TermRef(TermRef(ThisType(TypeRef(NoPrefix,module class feedletter)),object style),ComposeInfo),Universal), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class mchange)),object feedletter),ItemContent))))): untemplate.Untemplate[scala.Tuple2[com.mchange.feedletter.style.ComposeInfo.Universal, com.mchange.feedletter.ItemContent], scala.Nothing] {
955 val UntemplateInputDefaultArgument: scala.Option[scala.Tuple2[com.mchange.feedletter.style.ComposeInfo.Universal, com.mchange.feedletter.ItemContent]]
956}
957Unsupported type: Not supported type in refinement AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Option),List(AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class collection)),object immutable),Map),List(TypeRef(TermRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Predef),String), TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Any))))): untemplate.Untemplate[scala.collection.immutable.Map[scala.Predef.String, scala.Any], scala.Nothing] {
958 val UntemplateInputDefaultArgument: scala.Option[scala.collection.immutable.Map[scala.Predef.String, scala.Any]]
959}
960Unsupported type: Not supported type in refinement AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Option),List(TypeRef(TermRef(TermRef(ThisType(TypeRef(NoPrefix,module class feedletter)),object style),ComposeInfo),Universal))): untemplate.Untemplate[com.mchange.feedletter.style.ComposeInfo.Universal, scala.Nothing] {
961 val UntemplateInputDefaultArgument: scala.Option[com.mchange.feedletter.style.ComposeInfo.Universal]
962}
963Unsupported type: Not supported type in refinement AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Option),List(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class feedletter)),object style),StatusChangeInfo))): untemplate.Untemplate[com.mchange.feedletter.style.StatusChangeInfo, scala.Nothing] {
964 val UntemplateInputDefaultArgument: scala.Option[com.mchange.feedletter.style.StatusChangeInfo]
965}
966Unsupported type: Not supported type in refinement AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),Option),List(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class feedletter)),object style),RemovalNotificationInfo))): untemplate.Untemplate[com.mchange.feedletter.style.RemovalNotificationInfo, scala.Nothing] {
967 val UntemplateInputDefaultArgument: scala.Option[com.mchange.feedletter.style.RemovalNotificationInfo]
968}
9697 warnings found
970Successfully evaluated docJar
971Module is not a publish module, skipping publishing
972
973************************
974Build summary:
975[{
976 "module": "feedletter",
977 "compile": {"status": "ok", "tookMs": 30958, "warnings": 0, "errors": 0},
978 "doc": {"status": "ok", "tookMs": 12003, "files": 1, "totalSizeKb": 4726},
979 "test-compile": {"status": "skipped", "tookMs": 0, "warnings": 0, "errors": 0},
980 "test": {"status": "skipped", "tookMs": 0, "passed": 0, "failed": 0, "ignored": 0, "skipped": 0, "total": 0, "byFramework": []},
981 "publish": {"status": "skipped", "tookMs": 0},
982 "metadata": {
983 "crossScalaVersions": []
984}
985}]
986************************"
987
988Checking patch build.mill...
989Applied patch build.mill cleanly.