- ${optionalString (net.cidrv4 != null) ''
CIDRv4${net.cidrv4}
''}
- ${optionalString (net.cidrv6 != null) ''
CIDRv6${net.cidrv6}
''}
- '';
- };
-
- mkOverview = {
- width = 480;
- html =
- mkCardContainer
- /*
- html
- */
- ''
-
-
Networks Overview
-
-
- ${concatLines (flip map (attrValues config.networks) (
- net:
- /*
- html
- */
- ''
-
-
- ${html.net.netStylePreview net "w-12 h-4 mt-2 mr-4 rounded-md"}
-
-
${net.name}
- ${optionalString (net.cidrv4 != null) ''
CIDRv4${net.cidrv4}
''}
- ${optionalString (net.cidrv6 != null) ''
CIDRv6${net.cidrv6}
''}
-
-
-
- ''
- ))}
-
- ${spacingMt2}
- '';
- };
- };
-
- node = rec {
- mkInterface = interface:
- /*
- html
- */
- ''
-
- ${mkImage "w-8 h-8 m-1" (config.lib.icons.get interface.icon)}
- ${interface.id}
-
- '';
-
- serviceDetail = detail:
- /*
- html
- */
- ''
-
- ${detail.name}
-
- ${detail.text}
-
- '';
-
- serviceDetails = service:
- optionalString (service.details != {}) ''
''
- # FIXME: order not respected
- + concatLines ((map serviceDetail) (attrValues service.details));
-
- mkService = {
- additionalInfo ? "",
- includeDetails ? true,
- ...
- }: service:
- /*
- html
- */
- ''
-
-
- ${mkImage "w-12 h-12 mr-4 rounded-lg" (config.lib.icons.get service.icon)}
-
-
${service.name}
- ${optionalString (service.info != "") ''
${service.info}
''}
- ${additionalInfo}
-
-
- ${optionalString includeDetails (serviceDetails service)}
-
- '';
-
- mkGuest = guest:
- /*
- html
- */
- ''
-
-
- ${mkImageMaybe "w-12 h-12 mr-4" (config.lib.icons.get guest.deviceIcon)}
-
-
${guest.name}
-
${guest.guestType}
-
-
-
- '';
-
- mkCard = node: let
- services = filter (x: !x.hidden) (attrValues node.services);
- guests = filter (x: x.parent == node.id) (attrValues config.nodes);
- in {
- width = 480;
- html =
- mkCardContainer
- /*
- html
- */
- ''
-
- ${mkImageMaybe "w-8 h-8 mr-4" (config.lib.icons.get node.icon)}
-
- ${node.name}
- ${optionalString (node.hardware.info != null) ''${node.hardware.info}''}
-
-
- ${mkImageMaybe "w-12 h-12 ml-4" (config.lib.icons.get node.deviceIcon)}
-
-
- ${optionalString (node.interfaces != {}) ''
''}
- ${concatLines (map mkInterface (attrValues node.interfaces))}
- ${optionalString (node.interfaces != {}) ''
''}
-
- ${concatLines (map mkGuest guests)}
- ${optionalString (guests != []) spacingMt2}
-
- ${concatLines (map (mkService {}) services)}
- ${optionalString (services != []) spacingMt2}
- '';
- };
-
- mkImageWithName = node: {
- html = let
- deviceIconImage = config.lib.icons.get node.deviceIcon;
- in
- mkRootContainer "items-center"
- /*
- html
- */
- ''
-
- ${mkImageMaybe "w-8 h-8" (config.lib.icons.get node.icon)}
-
- ${node.name}
- ${optionalString (node.hardware.info != null) ''${node.hardware.info}''}
-
- ${optionalString (deviceIconImage != null && node.hardware.image != null -> deviceIconImage != node.hardware.image)
- ''
-
- ${mkImageMaybe "w-12 h-12" deviceIconImage}
- ''}
-
-
-
- ${mkImageMaybe "h-24" node.hardware.image}
-
- '';
- };
-
- mkPreferredRender = node:
- (
- if node.renderer.preferredType == "image" && node.hardware.image != null
- then mkImageWithName
- else mkCard
- )
- node;
- };
-
- services.mkOverview = {
- width = 480;
- html =
- mkCardContainer
- /*
- html
- */
- ''
-
-
Services Overview
-
-
- ${concatLines (flip map (attrValues config.nodes) (
- node: let
- services = filter (x: !x.hidden) (attrValues node.services);
- in
- concatLines (
- flip map services (
- html.node.mkService {
- additionalInfo = ''
${node.name}
'';
- includeDetails = false;
- }
- )
- )
- ))}
-
- ${spacingMt2}
- '';
- };
- };
-in {
- options.renderers.svg = {
- # FIXME: colors.bg0 = mkColorOption "bg0" "#";
-
- output = mkOption {
- description = "The derivation containing the rendered output";
- type = types.path;
- readOnly = true;
- };
- };
-
- config = {
- lib.renderers.svg = {
- services.mkOverview = renderHtmlToSvg html.services.mkOverview "services-overview";
-
- net.mkCard = net: renderHtmlToSvg (html.net.mkCard net) "card-net-${net.id}";
- net.mkOverview = renderHtmlToSvg html.net.mkOverview "networks-overview";
-
- node = {
- mkImageWithName = node: renderHtmlToSvg (html.node.mkImageWithName node) "image-with-name-${node.id}";
- mkCard = node: renderHtmlToSvg (html.node.mkCard node) "card-node-${node.id}";
- mkPreferredRender = node: renderHtmlToSvg (html.node.mkPreferredRender node) "preferred-render-node-${node.id}";
- };
- };
-
- renderers.svg.output = pkgs.runCommand "topology-svgs" {} ''
- mkdir -p $out/nodes
- ${concatLines (flip map (attrValues config.nodes) (node: ''
- cp ${config.lib.renderers.svg.node.mkPreferredRender node} $out/nodes/${node.id}.svg
- ''))}
- '';
- };
-}