Build Logs

swaldman/feedletter • 3.8.0-RC2:2025-11-27

Errors

0

Warnings

872

Total Lines

988

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