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