Skip to content

Support for deep object merging #30

@JakeStanger

Description

@JakeStanger

Currently object merging only takes the immediate children into account.

There may be utility in changing this, or adding additional syntax, to perform a 'deep merge', running the merge against every child object.

Issue originates from the below discussion, which compares the feature to Nix's 'attrset merge':

Discussed in https://github.com/orgs/corn-config/discussions/29

Originally posted by fbewivpjsbsby November 6, 2023

  1. What version of corn are you using?
    corn-cli 0.9.2
  2. What is your operating system?
    Windows 10

Description

It is like nixos module, config will merge when you imports config, use // operators or use mkMerge.
Corn is override attrsets now.

Steps to reproduce

  1. Write this in corn file:
let {
  $preferences_user_enable = {
    Value = true
    Status = "user"
  }

  // telemetry
  $policies_disable_telemetry = {
    DisableTelemetry = true
    DisableFirefoxStudies = true
  }
  // #TODO 'raw data' need git version corn
  // theme
  $policies_theme = {
    Preferences = {
      'toolkit.legacyUserProfileCustomizations.stylesheets' = $preferences_user_enable
      'layout.css.backdrop-filter.enabled' = $preferences_user_enable
      'widget.non-native-theme.use-theme-accent' = $preferences_user_enable
    }
  }

  $policies_ech = {
    // ech need enable DNS over HTTPS
    DNSOverHTTPS = {
      Enabled =  true
      ProviderURL = "https://1.1.1.1/dns-query"
      Locked = false
      ExcludedDomains = [""]
    }
    Preferences = {
      'network.dns.echconfig.enabled' = $preferences_user_enable
      'network.dns.http3_echconfig.enabled' = $preferences_user_enable
    }
  }
} in
{
  policies = {
    // telemetry
    ..$policies_disable_telemetry
    // ech
    ..$policies_ech
    // theme
    ..$policies_theme
  }
}
  1. run corn [your corn file name].corn -t json It is override by $policies_theme:
{
  "policies": {
    "DisableTelemetry": true,
    "DisableFirefoxStudies": true,
    "DNSOverHTTPS": {
      "Enabled": true,
      "ProviderURL": "https://1.1.1.1/dns-query",
      "Locked": false,
      "ExcludedDomains": [
        ""
      ]
    },
    "Preferences": {
      "toolkit.legacyUserProfileCustomizations.stylesheets": {
        "Value": true,
        "Status": "user"
      },
      "layout.css.backdrop-filter.enabled": {
        "Value": true,
        "Status": "user"
      },
      "widget.non-native-theme.use-theme-accent": {
        "Value": true,
        "Status": "user"
      }
    }
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request
    No fields configured for Feature.

    Projects

    Status

    Design

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions