144 lines
4.7 KiB
Nix
144 lines
4.7 KiB
Nix
{ chemistry, core, Substance, ... } @ libs:
|
||
let
|
||
inherit(core) context debug list path set string type;
|
||
|
||
check
|
||
= let
|
||
libs' = libs // { chemistry = chemistry // { inherit Substance; }; };
|
||
optional
|
||
= condition:
|
||
body:
|
||
if condition
|
||
then
|
||
[ body ]
|
||
else
|
||
[ ];
|
||
check1H
|
||
= name:
|
||
spectra:
|
||
if spectra."1H" or null != null
|
||
then
|
||
let
|
||
spectra' = spectra."1H".files;
|
||
in
|
||
[]
|
||
++ (
|
||
optional
|
||
(spectra'.self or null == null)
|
||
"1H-Spectrum for novel ${name} missing"
|
||
)
|
||
++ (
|
||
optional
|
||
(spectra'.cosy or null == null)
|
||
"1H-COSY-Spectrum for novel ${name} missing"
|
||
)
|
||
else
|
||
[ "1H-NMR for novel ${name} missing" ];
|
||
check13C
|
||
= name:
|
||
spectra:
|
||
if spectra."13C" or null != null
|
||
then
|
||
let
|
||
spectra' = spectra."13C".files;
|
||
in
|
||
[]
|
||
++ (
|
||
optional
|
||
(spectra'.self or spectra'.dc or null == null)
|
||
"13C-Spectrum for novel ${name} missing"
|
||
)
|
||
++ (
|
||
optional
|
||
(spectra'.apt or spectra'.dept135 or spectra'.dept45 or null == null)
|
||
"13C-APT/DEPT-Spectrum for novel ${name} missing"
|
||
)
|
||
else
|
||
[ "13C-NMR for novel ${name} missing" ];
|
||
checkNMR
|
||
= name:
|
||
nmr:
|
||
if nmr != null
|
||
then
|
||
[ ]
|
||
++ ( check1H name nmr )
|
||
++ ( check13C name nmr )
|
||
else
|
||
[ "NMR-Data for novel ${name} missing" ];
|
||
checkSubstance
|
||
= source:
|
||
{
|
||
name,
|
||
formula ? null,
|
||
ir ? null,
|
||
ms ? null,
|
||
nmr ? null,
|
||
novel ? false,
|
||
structure ? null,
|
||
synthesised ? true,
|
||
title ? null,
|
||
...
|
||
} @ self:
|
||
let
|
||
result
|
||
= []
|
||
++ ( optional (title == null) "Title for ${name} missing" )
|
||
++ ( optional (formula == null) "Formula for ${name} missing" )
|
||
++ ( optional (structure == null) "Structure for ${name} missing" )
|
||
++ (
|
||
if novel && synthesised
|
||
then
|
||
[]
|
||
++ ( optional (ir == null) "IR-Data for novel ${name} missing" )
|
||
++ ( optional (ms == null) "MS-Data for novel ${name} missing" )
|
||
++ ( checkNMR name nmr )
|
||
else
|
||
[]
|
||
);
|
||
in
|
||
debug.warn source
|
||
{
|
||
text = result;
|
||
when = result != [];
|
||
}
|
||
result;
|
||
in
|
||
source:
|
||
substances:
|
||
type.matchPrimitiveOrPanic substances
|
||
{
|
||
lambda = check source (substances libs');
|
||
path = check (source substances) (path.importScoped { inherit Substance; } substances);
|
||
list = list.concatMap (check source) substances;
|
||
set = checkSubstance source substances;
|
||
};
|
||
|
||
check'
|
||
= substances:
|
||
string.concatLines (check (context "check") substances);
|
||
|
||
checkNovel
|
||
= { ... } @ substances:
|
||
let
|
||
novelSubstances = list.filter ({ novel ? false, ... }: novel) (set.values substances);
|
||
formattedSubstances
|
||
= list.map
|
||
(
|
||
{ name, nmr ? null, ir ? null, ... }:
|
||
let
|
||
nmr'
|
||
= if nmr != null
|
||
then
|
||
nmr
|
||
else
|
||
"\\multicolumn{4}{c|}{– NMR? –}";
|
||
in
|
||
"${name} & "
|
||
)
|
||
novelSubstances;
|
||
in
|
||
[];
|
||
in
|
||
{
|
||
inherit check check' checkNovel;
|
||
} |