Well, it sounds to be somewhat more limited than how Nix manages services. The beauty of Nix is the ability to stay DRY and declare things only once, then refer to them where you need it.
For example, most of my services that need to bind to some specific network interfaces but require an IP address, don't hardcode anything, they all in lines of `services.foo.listen = head config.networking.interfaces.vpn.ipv4.addresses`. Should I want to renumber my networking, it'll be relatively painless. Same with user IDs, passwords, paths, etc - they're all trying to be references rather than copies.
Of course, this can be done with an external template engine, but I like how Nix integrates all those aspects in a convenient package.
For example, most of my services that need to bind to some specific network interfaces but require an IP address, don't hardcode anything, they all in lines of `services.foo.listen = head config.networking.interfaces.vpn.ipv4.addresses`. Should I want to renumber my networking, it'll be relatively painless. Same with user IDs, passwords, paths, etc - they're all trying to be references rather than copies.
Of course, this can be done with an external template engine, but I like how Nix integrates all those aspects in a convenient package.