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